在Python中调用具有混合数据类型参数的子进程

时间:2013-01-22 23:57:00

标签: python subprocess

我对如何完成这件事感到有些困惑。

我需要做的是从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并不能解决问题。

1 个答案:

答案 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的语法;当文件名中有空格或其他特殊字符时,它很容易破解。

所以第二种方法是首选。