如何在子流程运行结束后获取其环境变量?

2024-04-18 17:53:39 发布

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

我正在寻找一种方法来实现这一点,以便可以将其传递到另一个子进程的环境中。在


Tags: 方法环境进程
3条回答

不幸的是,一旦子进程退出,它的环境就会消失,即使使用/proc filesystem on Unix特殊文件/proc/[pid]/environ,它也不会反映子进程所做的更改。在

即使上面的方法有效,你也会有一个竞争条件:家长需要确定“正确的时间”来阅读环境,最好是在孩子修改环境之后。要做到这一点,家长需要与孩子协调,只要你在协调,你也可以明确地交流。在

您需要通过套接字、管道、共享内存等在父对象和子对象之间传递状态。multiprocessing module可以使这一点更简单,允许您通过队列或管道将数据从子对象传递到父对象。在

更新了下面是一个使用multiprocessing模块让父进程与子进程共享值,并让子进程在队列中彼此通信的一个快速示意图。它使它变得非常简单:

import os
from multiprocessing import Process, Manager, Queue

def worker1(d, q):
    # receive value from worker2
    msg = q.get()
    d['value'] += 1
    d['worker1'] = os.getpid(), msg

def worker2(d, q):
    # send value to worker1
    q.put('hi from worker2')
    d['value'] += 1
    d['worker2'] = os.getpid()

if __name__ == '__main__':
    mgr = Manager()
    d = mgr.dict()
    q = Queue()
    d['value'] = 1
    p1 = Process(target=worker1, args=(d,q))
    p1.start()
    p2 = Process(target=worker2, args=(d,q))
    p2.start()
    p1.join()
    p2.join()
    print d

结果:

^{pr2}$

下面是一个简单的函数,它在子进程中运行命令,然后将其环境提取到当前进程中。在

它基于Fnord的版本,没有tempfile,并且有一个标记行来区分SET命令和进程本身的任何输出。它不是防弹的,但它对我有用。在

def setenv(cmd):
    cmd = cmd + ' && echo ~~~~START_ENVIRONMENT_HERE~~~~ && set'

    env = (subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE)
                     .stdout
                     .read()
                     .decode('utf-8')
                     .splitlines())

    record = False
    for e in env:
        if record:
            e = e.strip().split('=')
            os.environ[e[0]] = e[1]
        elif e.strip() == '~~~~START_ENVIRONMENT_HERE~~~~': 
            record = True

你能在第一个子进程中打印出来并用python处理这个字符串吗?在

相关问题 更多 >