关于在Python中封装命令行工具的帮助

1 投票
2 回答
7162 浏览
提问于 2025-04-17 00:25

我遇到了一个问题,希望有人能帮我。我想为一个叫做 spooky 的命令行程序在 Python3.1 中创建一个封装器。我可以在命令行上成功运行这个程序,像这样:

$ 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

上面的代码也失败了,而且没有提供任何有用的错误信息。

我的问题是:我该如何让 Python 通过命令行运行这个程序,发送 spooky -a 4 -b .97 命令?非常感谢你能提供的任何帮助。提前谢谢你。

2 个回答

0

试着把你的命令写成一整串文字:

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

你需要去掉stdout=subprocess.PIPE这个部分。这样做可以把你的程序的输出(stdout)和Python的输出断开连接,这样你就可以通过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)

或者你也可以使用call这个函数:

process = subprocess.call(cmd)

撰写回答