在 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 命令的正确方法是什么?
-------- 编辑:要求--------
有些人发布了答案,但也许我应该更具体一些。我想将 stdout、stderr 和 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)
感谢 massiou 的指导,我找到了答案。罪魁祸首是在使用 shell=True
时,您应该将整个命令作为 单个字符串 !
传递
>>> subprocess.Popen(['echo $USER'], shell=True, \
stdout=subprocess.PIPE,\
stderr=subprocess.PIPE).communicate()
>>> ('manos\n', '')
原因是列表中的第一个参数将作为 shell 脚本执行。其余参数用于 shell 程序本身。
在我的程序中,我想让用户 运行 一个 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 命令的正确方法是什么?
-------- 编辑:要求--------
有些人发布了答案,但也许我应该更具体一些。我想将 stdout、stderr 和 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)
感谢 massiou 的指导,我找到了答案。罪魁祸首是在使用 shell=True
时,您应该将整个命令作为 单个字符串 !
>>> subprocess.Popen(['echo $USER'], shell=True, \
stdout=subprocess.PIPE,\
stderr=subprocess.PIPE).communicate()
>>> ('manos\n', '')
原因是列表中的第一个参数将作为 shell 脚本执行。其余参数用于 shell 程序本身。