使用子进程保存命令执行的输出

时间:2018-04-10 18:55:38

标签: python python-2.7 subprocess

我想在变量中输出subprocess.Popen。 它适用于pwd命令,但不适用于pwdx $(pgrep -U $USER -f SimpleHTTPServer)命令。

这有效:

(Pdb++) p = subprocess.Popen("pwd", stdout=subprocess.PIPE)
(Pdb++) result = p.communicate()[0]
(Pdb++) result
'xyz'

这不起作用:

(Pdb++) subprocess.Popen("pwdx $(pgrep -U $USER -f SimpleHTTPServer)", stdout=subprocess.PIPE)
*** OSError: [Errno 2] No such file or directory

有人可以告诉我如何将其输出保存到变量?

2 个答案:

答案 0 :(得分:2)

如果要将带参数的命令传递给Popen(),则必须将其作为列表传递,如下所示:

subprocess.Popen(['/bin/ls', '-lat'])

如果你只是传递一个字符串,就像你的例子中一样,它假设整个事物都是命令名,显然没有字面上命名为pwdx $(pgrep -U $USER -f SimpleHTTPServer)的命令。

答案 1 :(得分:0)

由于docs和之前的答案已经说明你要通过subprocess.Popen()执行的命令需要作为列表传递。

来自文档:

  

特别注意选项(例如-input)和参数(例如   由shell中的空格分隔的eggs.txt)进入   单独的列表元素,而需要引用或反斜杠的参数   在shell中使用时转义(例如包含空格的文件名)是单个列表元素。

您可以从文档中获得的另一个有用的提示是使用awk ' /[^",[:blank:]]/ {nonnull++} END {printf "%d / %d = %.2f\n", nonnull, NR, nonnull/NR} ' file 来帮助您将命令正确地拆分为列表。

请注意,使用特殊的shell参数(例如shlex.split())可能不适用于subprocess.Popen(),除非你设置$USER选项,你不应该这样做没有阅读文档的Security Considerations