我想在变量中输出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
有人可以告诉我如何将其输出保存到变量?
答案 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。