小编典典

为什么子流程中的简单回显不起作用

linux

我正在尝试使用子过程执行简单的回显操作:

import subprocess
import shlex

cmd = 'echo $HOME'
proc = subprocess.Popen(shlex.split(cmd), shell=True, stdout=subprocess.PIPE)
print proc.communicate()[0]

但是它什么也不打印。即使我将命令更改为echo "hello, world"它也不会打印任何内容。任何帮助表示赞赏。


阅读 294

收藏
2020-06-07

共1个答案

小编典典

在Unix上shell=True,第2个及以下参数表示外壳本身,请使用字符串将命令传递给外壳:

import subprocess

cmd = 'echo $HOME'
proc = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE)
print proc.communicate()[0],

您也可以将其编写为:

import subprocess

cmd = 'echo $HOME'
print subprocess.check_output(cmd, shell=True),

子流程的文档

在带有shell=True的Unix上,shell默认为/ bin /
sh。如果args是字符串,则该字符串指定要通过外壳执行的命令。这意味着字符串的格式必须与在shell提示符下键入时的格式完全相同。例如,这包括在文件名中使用引号或反斜杠转义。
如果args是序列,则第一项指定命令字符串,任何其他项将被视为shell本身的其他参数 。也就是说,Popen等效于:

Popen(['/bin/sh', '-c', args[0], args[1], ...])
2020-06-07