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

2024-03-29 09:17:03 发布

您现在位置:Python中文网/ 问答频道 /正文

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

$echo "teststring" | ./g2p @g2pumap=./map.txt

现在我正在使用python2.6编写python脚本,我需要在python中运行这个bash脚本(g2p)。你知道吗

我检查了这个答案:Python: subprocess and running a bash script with multiple arguments

我写道:

import subprocess

val = subprocess.check_call(["./eng_GBR/g2p",  "./map.txt"],  shell=True) 

我的问题是如何在python代码中向g2p(bash脚本)发送标准输入,而且我对将值传递给@g2pumap参数有点困惑。你知道吗


Tags: and文件答案echotxt脚本bashmap
2条回答

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


由于python3.5,^{}应该匹配大多数“用X调用程序”用例。它的input参数满足您的要求:

The input argument is passed to [...] the subprocess’s stdin.

您可以直接向其输入字节字符串:

import subprocess

g2p_process = subprocess.run(["./eng_GBR/g2p",  "@g2pumap=./map.txt"], input=b'teststring\n')

这相当于您的bash调用。注意,您必须自己添加适当的换行符(b"\n"在末尾)。任何参数,如@g2pumap=./map.txt,都可以在不转义的情况下传入。你知道吗

如果您想要有check_call的异常,请在后面使用g2p_process.check_returncode()。你知道吗


如果您使用的是较旧的版本或需要向后兼容,那么使用裸的subprocess.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_process.communicate返回一个有意义的(stdoutdata, stderrdata)元组。你知道吗

请参阅subprocess.Popenmethod docs中有关如何处理此类对象的内容。通常最好检查它的returncodekill悬挂进程。如果您愿意,还可以复制^{},因为它可以进行正确的错误处理。你知道吗

import subprocess

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

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

相关问题 更多 >