Python 如何将os.popen设置为使用Bash?
我有以下用于在Python中执行系统命令的函数:Python 如何将os.popen设置为使用Bash?,python,bash,operating-system,subprocess,Python,Bash,Operating System,Subprocess,我有以下用于在Python中执行系统命令的函数: def engage_command( command = None ): #os.system(command) return os.popen(command).read() 我使用操作系统模块而不是子流程模块,因为我处理的是一个单一的环境,在这个环境中,我与许多环境变量等进行交互 如何将Bash与这种类型的函数一起使用,而不是使用默认的sh shell 我处理的是一个单一的环境,在这个环境中,我与许多环境
def engage_command(
command = None
):
#os.system(command)
return os.popen(command).read()
我使用操作系统模块而不是子流程模块,因为我处理的是一个单一的环境,在这个环境中,我与许多环境变量等进行交互
如何将Bash与这种类型的函数一起使用,而不是使用默认的sh shell
我处理的是一个单一的环境,在这个环境中,我与许多环境变量进行交互
每个os.popencmd调用都会创建一个新的/bin/sh进程,以运行cmd shell命令
也许,从以下方面看,这并不明显:
打开到命令cmd或从命令cmd打开管道
打开一个无法清晰通信的管道:使用重定向的标准输入或输出启动一个新的shell进程-您可以
如果有任何疑问;确认每个成功的os.popen调用都会创建一个新的子进程
考虑:
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==
====
==value==
==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==
==value==
注意:$VAR在这里不是空的
如果需要根据以前命令的输出动态生成新命令;它会创建一些问题,并且可以使用pexpect模块修复一些问题:
我处理的是一个单一的环境,在这个环境中,我与许多环境变量进行交互
每个os.popencmd调用都会创建一个新的/bin/sh进程,以运行cmd shell命令
也许,从以下方面看,这并不明显:
打开到命令cmd或从命令cmd打开管道
打开一个无法清晰通信的管道:使用重定向的标准输入或输出启动一个新的shell进程-您可以
如果有任何疑问;确认每个成功的os.popen调用都会创建一个新的子进程
考虑:
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==
====
==value==
==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==
==value==
注意:$VAR在这里不是空的
如果需要根据以前命令的输出动态生成新命令;它会产生问题,一些问题可以使用pexpect模块解决。感谢您的建议。正如我在问题中提到的,我正在与许多环境变量等进行交互,因此,就我的目的而言,操作系统模块是我试图使用的。@d3pd:使用操作系统模块在这里什么都没有。单击链接:os.popen仍在后台使用子流程。@JFSebastian Ok,感谢您的澄清。您是否可以举例说明如何使用这种方法设置和使用环境变量可能是这样的:export MY_DIRECTORY=~/test,ls${MY_DIRECTORY}@d3pd:我已经更新了答案,以显示envvars在多个命令中的行为。@JFSabastian非常感谢您提供了这些清晰而有用的详细信息。您的解决方案澄清了os.popen的子流程性质,并展示了如何在子流程中使用Bash。您是否知道是否有某种方法可以维护从Python创建和访问的子流程的Bash环境的存在?谢谢您的建议。正如我在问题中提到的,我正在与许多环境变量等进行交互,因此,就我的目的而言,操作系统模块是我试图使用的。@d3pd:使用操作系统模块在这里什么都没有。单击链接:os.popen仍在后台使用子流程。@JFSebastian Ok,感谢您的澄清。您是否可以举例说明如何使用这种方法设置和使用环境变量可能是这样的:export MY_DIRECTORY=~/test,ls${MY_DIRECTORY}@d3pd:我已经更新了答案,以显示envvars在多个命令中的行为。@JFSabastian非常感谢您提供了这些清晰而有用的详细信息。您的解决方案澄清了os.popen的子流程性质,并展示了如何在子流程中使用Bash。您是否知道,是否有某种方法可以维护从Python创建和访问的子流程的Bash环境的存在?