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

flo*_*ree 9 python linux subprocess

我正在尝试使用子进程执行简单的echo操作:

import subprocess
import shlex

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

但它什么都不打印.即使我将命令更改为echo "hello, world"它仍然没有打印任何内容.任何帮助表示赞赏.

jfs*_*jfs 12

在Unix上shell=True暗示第2个和后面的参数是针对shell本身的,使用字符串将命令传递给shell:

import subprocess

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

你也可以把它写成:

import subprocess

cmd = 'echo $HOME'
print subprocess.check_output(cmd, shell=True),
Run Code Online (Sandbox Code Playgroud)

子进程'docs:

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

Popen(['/bin/sh', '-c', args[0], args[1], ...])
Run Code Online (Sandbox Code Playgroud)