我对如何完成这件事感到有些困惑。
我需要做的是从Python脚本中调用外部命令,该命令将多个参数和文件名作为输入。
让我们调用我称之为“prog”的可执行文件,输入文件“file”,所以命令行(在Bash终端中)看起来像这样:
$ prog --{arg1} {arg2} < {file}
在上面{arg1}是一个字符串,{arg2}是一个整数。
如果我使用以下内容:
#!/usr/bin/python
import subprocess as sbp
sbp.call(["prog","--{arg1}","{arg2}","<","{file}"])
结果是“prog”输出错误,声称输入丢失{arg2}
以下产生了一个有趣的错误:
#!/usr/bin/python
import subprocess as sbp
sbp.call(["prog","--{arg1} {arg2} < {file}"])
所有空格似乎都已从第二个字符串中删除,并在最后附加了等号:
command not found --{arg1}{arg2}<{file}=
这些行为似乎对我没有任何意义,并且从网上找到的Python手册页中可以找到的内容并不多。请注意,用sbp.Popen替换sbp.call并不能解决问题。
答案 0 :(得分:4)
问题是< {file}
实际上并不是程序的参数,而是shell设置重定向的语法。您可以告诉Python使用shell,或者您可以自己设置重定向。
from subprocess import *
# have shell interpret redirection
check_call('wc -l < /etc/hosts', shell=True)
# set up redirection in Python
with open('/etc/hosts', 'r') as f:
check_call(['wc', '-l'], stdin=f.fileno())
第一种方法的优点是键入更快更容易。但是有很多缺点:自启动shell以来它可能会更慢;它可能是不可移植的,因为它取决于操作系统shell的语法;当文件名中有空格或其他特殊字符时,它很容易破解。
所以第二种方法是首选。