帮助在Python中包装命令行工具

时间:2011-08-26 17:49:54

标签: python subprocess wrapper

我真的遇到了一个问题,我希望有人可以帮助我。我正在尝试在Python3.1中为名为spooky的命令行程序创建一个包装器。我可以在命令行上成功运行这个程序,如下所示:

$ spooky -a 4 -b .97

我第一次使用spooky的Python包装器看起来像这样:

import subprocess

start = "4"
end = ".97"

spooky_path = '/Users/path/to/spooky'
cmd = [spooky_path, '-a', start, '-b', end]
process = subprocess.Popen(cmd, stdout=subprocess.PIPE)
process.wait()
print('Done')

以上代码打印Done,但不执行程序spooky

接下来,我尝试在命令行上执行程序,如下所示:

$ /Users/path/to/spooky -a 4 -b .97

上述代码也失败了,并没有提供任何有用的错误。

我的问题是:如何通过将spooky -a 4 -b .97发送到命令行来让Python运行此程序?我非常感谢您提供的任何帮助。提前谢谢。

2 个答案:

答案 0 :(得分:3)

您需要删除stdout = subprocess.PIPE。这样做会将进程的stdout与Python的stdout断开连接,并使用Popen.communicate()函数进行检索,如下所示:

import subprocess

spooky_path = 'ls'
cmd = [spooky_path, '-l']
process = subprocess.Popen(cmd, stdout=subprocess.PIPE)
output = process.communicate()[0]
print "Output:", output
process.wait()
print('Done')

要使其直接打印,您可以在没有stdout参数的情况下使用它:

process = subprocess.Popen(cmd)

或者您可以使用通话功能:

process = subprocess.call(cmd)

答案 1 :(得分:0)

尝试将命令转换为单个字符串:

cmd = 'spooky_path -a start -b end'
process = subprocess.Popen(cmd, shell=True)