3

我对如何完成这项工作感到有些困惑。

我需要做的是从 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.call 替换为 sbp.Popen 并不能解决问题。

4

1 回答 1

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())

第一种方法的优点是打字更快、更容易。但是,有很多缺点:由于您正在启动外壳,它可能会变慢;它可能是不可移植的,因为它取决于操作系统外壳的语法;当文件名中有空格或其他特殊字符时,它很容易中断。

所以首选第二种方法。

于 2013-01-23T00:00:21.513 回答