使用Python中的子进程复制os.system功能?

时间:2016-02-12 12:40:28

标签: python shell subprocess environment-variables os.system

在我的程序中,我想让用户运行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命令的正确方法是什么?

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

有些人发布了答案,但也许我应该更具体一些。我希望保留标准输出标准符,并在某处返回值存储。所有答案似乎都给出了一个或那个。

3 个答案:

答案 0 :(得分:1)

使用call方法

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

Altarnetivly:

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

答案 1 :(得分:1)

感谢Massiou方向,我找到了答案。罪魁祸首是,当使用shell=True时,您应该将整个命令作为单个字符串传递!

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

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

答案 2 :(得分:0)

您可以执行以下操作:

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

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