在 Python 中使用子流程复制 os.system 功能?

Replicate os.system functionality with subprocess in Python?

在我的程序中,我想让用户 运行 一个 shell 命令或执行一个二进制文件。无论我阅读了多少有关 subprocess.Popen 的内容,我都无法找到一种方法来复制 os.system() 功能。

我只是想 echo $USER 但似乎没有任何效果。

shell=True..

>>> subprocess.Popen(['echo', '$USER'], shell=True,\
                     stdout=subprocess.PIPE,\
                     stderr=subprocess.PIPE).communicate()
>>> ('\n', '')

传递当前环境变量..

>>> subprocess.Popen(['echo', '$USER'], shell=True,\
                     env=os.environ\
                     stdout=subprocess.PIPE,\
                     stderr=subprocess.PIPE).communicate()
>>> ('\n', '')

那么 运行 shell 命令的正确方法是什么?

-------- 编辑:要求--------

有些人发布了答案,但也许我应该更具体一些。我想将 stdoutstderr 和 return value 存储在某处。所有的答案似乎都给出了一个或另一个。

使用call方法

subprocess.call('echo $USER',shell=True)

另类:

var = subprocess.check_output('echo $USER',shell=True) # .rstrip('\n')
print var

还有subprocess.Popen()

process = subprocess.Popen("echo $USER",shell=True,stdout=subprocess.PIPE)
print process.communicate()[0],

你可以做类似的事情:

subprocess.call('echo $USER', shell=True)

另外,看看Replacing Older Functions with the subprocess Module

感谢 massiou 的指导,我找到了答案。罪魁祸首是在使用 shell=True 时,您应该将整个命令作为 单个字符串 !

传递
>>> subprocess.Popen(['echo $USER'], shell=True, \
                     stdout=subprocess.PIPE,\
                     stderr=subprocess.PIPE).communicate()
>>> ('manos\n', '')

原因是列表中的第一个参数将作为 shell 脚本执行。其余参数用于 shell 程序本身。