在使用没有shell的subprocess.call时,如何将字符串传递给脚本

时间:2013-02-28 01:04:52

标签: python subprocess

我正在使用

subprocess.call(['prog', 'arg'], shell=False)

执行prog并让我自己逃避arg。

现在有时候需要来自STDIN的一些输入。在shell中我可以使用

echo 'some input' | prog arg

使用管道。如何在不自动转义arg的情况下使用子进程执行此操作?这甚至可能吗?

或者是唯一的方法

subprocess.call('echo "%s" | prog "%s"' % ('some input', 'arg'), shell=True)

根本不安全。

1 个答案:

答案 0 :(得分:5)

proc = subprocess.Popen(['prog', 'arg'], shell=False, stdin=subprocess.PIPE)
out, err = proc.communicate('some input')

这基本上是call所做的事情,除了周围的对象让你有机会在其上调用communicate。 (返回代码在proc.returncode。)

请注意,如果您想要实际获取stdout或stderr,则还需要将PIPE传递给构造函数。如上所述,它们都会以None形式出现。

Docs


事后补充:如果您正在进行大量外部呼叫,您可能还想给plumbum一个旋转;它做了一堆运算符重载hackery以提供类似于shell的语法。