在我的程序中,我想让用户运行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命令的正确方法是什么?
-------编辑:要求---------
有些人发布了答案,但也许我应该更具体一些。我希望保留标准输出,标准符,并在某处返回值存储。所有答案似乎都给出了一个或那个。
答案 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)