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

2024-04-25 12:42:53 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图在python3中执行几行bash,并分别检查每行的状态。你知道吗

我第一次尝试从subprocess使用gestatusoutput,但是每一行都运行在一个独立的进程中,不与其他行通信(为了简单起见,给定的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工作,状态返回cmd0之前发生的任何事情),这不是很健壮。你知道吗

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

任何帮助都将不胜感激!你知道吗


Tags: 代码testechocmdbash进程状态export
2条回答

对我来说,您试图在两个进程之间共享环境变量,这是不可能的。 看起来是这样的:

Process 1 python main.py                #TEST = "" 
    |Process 2 >"export TEST=1"        #Change Process2 env variable TEST to '1'
    |Process 3 >"echo $TEST"           #Print Process3 env variable TEST (get from process 1)

你可以用操作系统环境[]要先更改当前环境(进程1变量),稍后使用fork后面的变量。你知道吗

像这样的

import os
import subprocess
import sys

os.environ['TEST'] = '1'
out = subprocess.check_call('echo $TEST',shell = True)

我做了以下工作:

  • 创建一个launch命令包装subprocess.Popen来启动bash命令,它还允许我检索当前环境或传递自定义环境
  • 创建一个get_env来解析来自上一个命令的返回,并获得环境的dict

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

相关问题 更多 >