有没有一种方法可以在python的子进程调用之间保留/传输bash环境?

时间:2018-11-01 13:02:14

标签: python bash shell

问题:假设我有脚本ABC1C2,... CN

脚本B源于脚本A,该脚本包含多个环境变量和函数,然后调用依赖它们的C脚本。

现在,假设我想用python程序替换bash脚本B。 如果我只想一次“来源” A(而不是在每次C调用之前),该怎么做?

我希望能够分别“处理”每个C,即在每个C执行之后运行一些python代码,因此创建一些大的". A && C1 && C2 ..."命令是不会的。

2 个答案:

答案 0 :(得分:0)

我不确定这是否会回答问题,因为我认为您编写它的方式仍不清楚,但是您可以使用此代码段解析bash脚本并从python运行它们,同时捕获每一行的输出,因此它可能会给您一个起点

import subprocess

def start_process(command=''):
    return subprocess.Popen(command.split(' '), stdout=subprocess.PIPE, shell=False, 
creationflags = 0x08000000)

with open('yourscript.sh','rt') as f:
    lines = f.read().split('\n')
    output=[str(start_process(line).communicate()[0]) for line in lines]

通过这种方式,您可以构建一个结构,在该结构中python脚本协调bash脚本,而不是在合理的情况下保持平等

答案 1 :(得分:0)

在您的Python程序中嵌入bash解释器的简短操作(这不是现实的选择; bash并非旨在做到这一点),最简单的方法是编写包装器外壳脚本源A,然后使用exec运行Python脚本。在exec之后,您的Python脚本将保持与包装器相同的环境,包括在A中找到的所有内容:

# wrapper script
source A
exec B.py

B.py中,每个Ci脚本将通过A的环境继承B.py中定义的变量。


另一种选择是将A移植到B.py可以直接导入的Python模块中。你会改变

export x=foo
export y=1

进入

import os
os.environ["x"] = "foo"
os.environ["y"] = "1"

取决于A的实际参与程度,移植可能并不容易,这就是为什么我建议首先使用exec进行包装的原因。