我正在尝试使用子进程执行简单的回显操作:
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"
,它仍然不会打印任何内容。任何帮助表示赞赏。
答案 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),
在带有
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)