用Python中的子进程复制os.system功能?
在我的程序中,我想让用户运行shell命令或执行二进制文件。无论我读了多少关于用Python中的子进程复制os.system功能?,python,shell,subprocess,environment-variables,os.system,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,\ st
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命令的正确方法是什么
-------编辑:要求---------
有些人给出了答案,但也许我应该更具体一些。我想保留标准输出,标准输出,并返回存储在某处的值。所有答案似乎都给出了一个或另一个。使用
调用方法
subprocess.call('echo $USER',shell=True)
另一方面:
var = subprocess.check_output('echo $USER',shell=True) # .rstrip('\n')
print var
也使用subprocess.Popen()
您只需执行以下操作:
subprocess.call('echo $USER', shell=True)
另外,看看多亏了马修的指导,我找到了答案。罪魁祸首是当使用shell=True
时,您应该将整个命令作为单个字符串来传递
>>> subprocess.Popen(['echo $USER'], shell=True, \
stdout=subprocess.PIPE,\
stderr=subprocess.PIPE).communicate()
>>> ('manos\n', '')
原因是列表中的第一个参数将作为shell脚本执行。其余参数用于shell程序本身。为什么不直接使用os.environ['USER']
?或者更好的是,import getpass
和getpass.getuser()
用于跨操作系统兼容性。@DanielRoseman因为我不知道用户将运行什么命令,所以只需传递所有环境就更容易了..相关:这似乎可行,但我似乎无法将输出保存在变量中..@Pithikos然后使用检查输出
谢谢,这很有效。尽管我没有得到返回码。这就是我开始使用Popen的原因。。我更愿意保留所有的stderr、stdout和返回代码。
>>> subprocess.Popen(['echo $USER'], shell=True, \
stdout=subprocess.PIPE,\
stderr=subprocess.PIPE).communicate()
>>> ('manos\n', '')