Python:使用Python的标准输入运行bash脚本

Python:使用Python的标准输入运行bash脚本,python,bash,Python,Bash,我有一个名为g2p的bash脚本文件,其运行方式如下: $echo "teststring" | ./g2p @g2pumap=./map.txt 现在我正在使用Python2.6编写一个python脚本,我需要在python中运行这个bash脚本(g2p) 我检查了这个答案: 我写道: import subprocess val = subprocess.check_call(["./eng_GBR/g2p", "./map.txt"], shell=True) 我的问题是如何在p

我有一个名为g2p的bash脚本文件,其运行方式如下:

$echo "teststring" | ./g2p @g2pumap=./map.txt
现在我正在使用Python2.6编写一个python脚本,我需要在python中运行这个bash脚本(g2p)

我检查了这个答案:

我写道:

import subprocess

val = subprocess.check_call(["./eng_GBR/g2p",  "./map.txt"],  shell=True) 
我的问题是如何在python代码中向g2p(bash脚本)发送标准输入,而且我对将值传递给@g2pumap参数感到有点困惑。

对Python2.6的限制后来被添加到问题中。答案的最后是一个可移植的解决方案

import subprocess

value1=...
value2=...
......

val = subprocess.check_call(["path/script.sh",  value1+" "+value2+" "+ .... ],  shell=True) 

自Python 3.5以来,它应该与大多数“用X调用程序”用例相匹配。它的
input
参数满足您的要求:

input
参数被传递给子流程的stdin

您可以直接向其提供字节字符串:

import subprocess

g2p_process = subprocess.run(["./eng_GBR/g2p",  "@g2pumap=./map.txt"], input=b'teststring\n')
这相当于bash调用。请注意,您必须自己添加适当的换行符(
b”\n“
)。任何参数,例如
@g2pumap=./map.txt
,都可以在不转义的情况下传入

如果您希望出现异常的
check\u call
,请使用
g2p\u进程。然后检查返回代码()


如果您使用的是旧版本或需要向后兼容,则使用裸
子流程。Popen
是最可移植的。以下内容应适用于您的用例:

import subprocess

g2p_process = subprocess.Popen(
    ["./eng_GBR/g2p", "@g2pumap=./map.txt"],
    stdin=subprocess.PIPE,  # allow sending data via STDIN
)
g2p_process.communicate(input="teststring\n")
if g2p_process.returncode != 0:
    raise RuntimeError
注意,如果需要,还可以捕获stdout和stderr。在调用
Popen
时使用
stdout=subprocess.PIPE
和/或
stderr=subprocess.PIPE
。这样做可以让
g2p\u进程进行通信
返回一个有意义的
(stdoutdata,stderdata)

有关如何使用此类对象,请参见
子流程.Popen
。通常最好检查其
returncode
kill
挂起的进程。如果您愿意,也可以进行复制,因为它可以进行正确的错误处理。

对Python2.6的限制后来被添加到问题中。答案的最后是一个可移植的解决方案


自Python 3.5以来,它应该与大多数“用X调用程序”用例相匹配。它的
input
参数满足您的要求:

input
参数被传递给子流程的stdin

您可以直接向其提供字节字符串:

import subprocess

g2p_process = subprocess.run(["./eng_GBR/g2p",  "@g2pumap=./map.txt"], input=b'teststring\n')
这相当于bash调用。请注意,您必须自己添加适当的换行符(
b”\n“
)。任何参数,例如
@g2pumap=./map.txt
,都可以在不转义的情况下传入

如果您希望出现异常的
check\u call
,请使用
g2p\u进程。然后检查返回代码()


如果您使用的是旧版本或需要向后兼容,则使用裸
子流程。Popen
是最可移植的。以下内容应适用于您的用例:

import subprocess

g2p_process = subprocess.Popen(
    ["./eng_GBR/g2p", "@g2pumap=./map.txt"],
    stdin=subprocess.PIPE,  # allow sending data via STDIN
)
g2p_process.communicate(input="teststring\n")
if g2p_process.returncode != 0:
    raise RuntimeError
注意,如果需要,还可以捕获stdout和stderr。在调用
Popen
时使用
stdout=subprocess.PIPE
和/或
stderr=subprocess.PIPE
。这样做可以让
g2p\u进程进行通信
返回一个有意义的
(stdoutdata,stderdata)


有关如何使用此类对象,请参见
子流程.Popen
。通常最好检查其
returncode
kill
挂起的进程。如果您愿意,也可以进行复制,因为它有正确的错误处理。

Sinec我使用的是python 2.6.6,它没有这个属性,我想我应该使用“subprocess.call/check\u call”“您应该在问题中指出版本限制。Python2.6.6已经严重过时了,我认为Python2.6已经有一半的历史了。现在人们只使用2.7和3.x,有选择的人使用2.7或3.x。但是,是的,2.6已经足够老了,值得特别提及。@Zeinab我添加了一个与Python 2.4-3.X.Sinec一起工作的版本。我使用的是Python 2.6.6,它没有这个属性,我想我应该使用“subprocess.call/check_call”“您应该在问题中指出版本限制。Python2.6.6已经严重过时了,我认为Python2.6已经有一半的历史了。现在人们只使用2.7和3.x,有选择的人使用2.7或3.x。但是是的,2.6已经足够老了,值得特别提及。@Zeinab我添加了一个与Python 2.4-3.X一起工作的版本。