为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Smart猫小萌 2021-10-19 14:52:12
我正在尝试bash在 Python 3 中执行几行并分别检查每一行的状态。我首先尝试使用gestatusoutputfrom subprocess,但每一行都在一个不与其他人通信的单独进程中运行(为简单起见,给定的 MWE 包括设置一个变量,但我打算在我的实际代码中做的是比这更复杂——我知道os.environ这个非常具体的例子):from subprocess import getstatusoutput as cmdstat, out = cmd("export TEST=1")stat, out = cmd("echo $TEST")因此将返回:>>> print(out)(0, "")然后我尝试了以下方法:cmdline = """export TEST=1echo $TEST"""stat, out = cmd(cmdline)这有效但迫使我解析输出,特别是如果我想检查第一个命令echo的状态(如果有效,返回的状态cmd是0之前发生的任何事情),这不是很健壮。我看到一些东西在使用Popen(仍然来自subprocess),但无法有效地使用它。任何帮助,将不胜感激!
查看完整描述

2 回答

?
倚天杖

TA贡献1828条经验 获得超3个赞

我结果做了以下事情:

  • 创建一个launch命令包装subprocess.Popen来启动我的 bash 命令,另外允许我检索当前环境或传递自定义环境

  • 创建 aget_env来解析上一个命令的返回并获取dict环境的 a


launch 包装纸

import os

import subprocess as sp


def launch(cmd_, env=os.environ, get_env=False):

    if get_env: cmd_ += " && printenv"

    load = sp.Popen(cmd_, shell=True, stdout=sp.PIPE, stderr=sp.PIPE, env=env)

    out  = load.communicate()

    err  = load.returncode

    return(err, out)

检索环境

def get_env(out, encoding='utf-8'):

    lout = str(out[0], encoding).split('\n')

    new_env = {}

    for line in lout:

        if len(line.split('=')) <= 1:

            pass

        else:

            k = line.split("=")[0]

            v = "=".join(line.split("=")[1:])

            new_env[k] = v

    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


查看完整回答
反对 回复 2021-10-19
  • 2 回答
  • 0 关注
  • 248 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号