我有以下用于在Python中执行系统命令的函数:
def engage_command(
command = None
):
#os.system(command)
return os.popen(command).read()
我正在使用os
模块而不是subprocess
模块,因为我正在处理一个与许多环境变量等交互的环境。
如何将Bash用于此类函数而不是默认的sh
shell?
答案 0 :(得分:4)
output = subprocess.check_output(command, shell=True, executable='/bin/bash')
os.popen()
is implemented in terms of subprocess
module
我正在处理一个与许多环境变量等交互的环境。
每次os.popen(cmd)
调用都会创建 新 /bin/sh
进程,以运行cmd
shell命令。
也许,从the os.popen()
documentation that says开始并不明显:
在命令
之间打开管道cmd
"打开一个管道" 没有清楚地沟通:"启动一个带有重定向标准输入或输出的新shell进程" - 你可以report a documentation issue。
如果有任何疑问; source确认每次成功的os.popen()
来电都会创建新的子流程
the child can't modify its parent process environment (normally)
考虑:
import os
#XXX BROKEN: it won't work as you expect
print(os.popen("export VAR=value; echo ==$VAR==").read())
print(os.popen("echo ==$VAR==").read())
输出:
==value==
====
====
表示第二个命令中$VAR
为空,因为第二个命令在与第一个命令不同的/bin/sh
进程中运行。
要在单个进程中运行多个bash命令,请将它们放在脚本中或以字符串形式传递:
output = check_output("\n".join(commands), shell=True, executable='/bin/bash')
示例:
#!/usr/bin/env python
from subprocess import check_output
output = check_output("""
export VAR=value; echo ==$VAR==
echo ==$VAR==
""", shell=True, executable='/bin/bash')
print(output.decode())
输出:
==value==
==value==
注意:此处$VAR
不为空。
如果需要动态生成新命令(基于以前命令的输出);它会创建several issues,并且可以使用pexpect
模块修复部分问题:code example。