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

用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

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

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


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

使用
调用
方法

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', '')