在 Python 中运行多行 bash 并分别检查它们的状态和输出

我正在尝试bash在 Python 3 中执行几行并分别检查每一行的状态。


我首先尝试使用gestatusoutputfrom subprocess,但每一行都在一个不与其他人通信的单独进程中运行(为简单起见,给定的 MWE 包括设置一个变量,但我打算在我的实际代码中做的是比这更复杂——我知道os.environ这个非常具体的例子):


from subprocess import getstatusoutput as cmd


stat, out = cmd("export TEST=1")

stat, out = cmd("echo $TEST")

因此将返回:


>>> print(out)

(0, "")

然后我尝试了以下方法:


cmdline = """export TEST=1

echo $TEST"""

stat, out = cmd(cmdline)

这有效但迫使我解析输出,特别是如果我想检查第一个命令echo的状态(如果有效,返回的状态cmd是0之前发生的任何事情),这不是很健壮。


我看到一些东西在使用Popen(仍然来自subprocess),但无法有效地使用它。


任何帮助,将不胜感激!


Smart猫小萌
浏览 249回答 2
2回答

倚天杖

我结果做了以下事情:创建一个launch命令包装subprocess.Popen来启动我的 bash 命令,另外允许我检索当前环境或传递自定义环境创建 aget_env来解析上一个命令的返回并获取dict环境的 alaunch&nbsp;包装纸import osimport subprocess as spdef launch(cmd_, env=os.environ, get_env=False):&nbsp; &nbsp; if get_env: cmd_ += " && printenv"&nbsp; &nbsp; load = sp.Popen(cmd_, shell=True, stdout=sp.PIPE, stderr=sp.PIPE, env=env)&nbsp; &nbsp; out&nbsp; = load.communicate()&nbsp; &nbsp; err&nbsp; = load.returncode&nbsp; &nbsp; return(err, out)检索环境def get_env(out, encoding='utf-8'):&nbsp; &nbsp; lout = str(out[0], encoding).split('\n')&nbsp; &nbsp; new_env = {}&nbsp; &nbsp; for line in lout:&nbsp; &nbsp; &nbsp; &nbsp; if len(line.split('=')) <= 1:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; pass&nbsp; &nbsp; &nbsp; &nbsp; else:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; k = line.split("=")[0]&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; v = "=".join(line.split("=")[1:])&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; new_env[k] = v&nbsp; &nbsp; return new_env(这是一个简单的版本,如果你的环境中有函数之类的东西,它可能会更复杂——它会发生。)结果:我可以按如下方式使用它:err, out = launch("export TEST=1", get_env=True)if not err: new_env = get_env(out)err, out = launch("echo $TEST", env=new_env)因此:>>> print(str(out[0], encoding='utf-8'))1
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python