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

时间:2013-06-21 02:38:53

标签: python linux subprocess

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

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",它仍然不会打印任何内容。任何帮助表示赞赏。

2 个答案:

答案 0 :(得分:11)

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

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),

来自the subprocess' docs

  

在带有shell=True的Unix上,shell默认为/ bin / sh。如果args是   string,string指定通过shell执行的命令。   这意味着字符串必须完全按照原样进行格式化   在shell提示符下键入时。这包括,例如,引用或   反斜杠转义文件名,其中包含空格。 如果args是   sequence,第一项指定命令字符串,以及任何   其他项目将被视为shell的附加参数   本身。也就是说,Popen相当于:

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

答案 1 :(得分:1)

你混淆了Popen的两种不同的调用。这些都可以起作用:

proc=subprocess.Popen(['/bin/echo', 'hello', 'world'], shell=False, stdout=subprocess.PIPE)

proc=subprocess.Popen('echo hello world', shell=True, stdout=subprocess.PIPE)

传递shell = True时,第一个参数是一个字符串 - shell命令行。不使用shell时,第一个参数是一个列表。两者都产生了这个:

print proc.communicate()
('hello world\n', None)