python 3.4 multiprocessing - 为不同的进程改变ld_library_path

python 3.4 multiprocessing - change ld_library_path for different processes

我正在使用 python 多处理模块在单独的进程中调用 python 函数,我希望此进程的环境变量 $LD_LIBRARY_PATH 具有不同的值。 具体来说,我需要在进程引用它之前将一个字符串附加到现有值。示例代码如下所示:

import os
from multiprocessing import Process
import sys

orig_env = os.environ['LD_LIBRARY_PATH']

def startProc_A():
   a_env = orig_env + 'path/1'
   os.environ['LD_LIBRARY_PATH'] = a_env
   print(os.environ['LD_LIBRARY_PATH'])
   sys.path.append('path/1')
   new_proc = Process(target = func_A, args=(0,))
   new_proc.start()

def func_A():
   import module_A

在 print 语句中,我可以看到 os.environ['LD_LIBRARY_PATH'] 已正确更新,但是,我的进程仍在引用 python 启动时的值,意思是module_A还是指旧的LD_LIBRARY_PATH

有没有办法在脚本中动态更新这个值。

回复。谢谢

os.putenv() 的 documentation 包括文本:

"... Such changes to the environment affect subprocesses started with os.system(), popen() or fork() and execv()"

所以,你可以这样做:

import os

def func_A():
    print os.environ['LANG']
    os._exit(0)  

orig_env = os.environ['LANG']
a_env = orig_env + 'something_else'
os.environ['LANG'] = a_env    

newpid = os.fork()
if newpid == 0:   # this is the child process
    func_A()

... 或者(可能更好)在 fork() 调用之后,像这样:

import os

def func_A():
    print os.environ['LANG']
    os._exit(0)  


newpid = os.fork()
if newpid == 0:   # this is the child process
    orig_env = os.environ['LANG']
    a_env = orig_env + 'something_else'
    os.environ['LANG'] = a_env    
    func_A()

(edit) 以下内容似乎也有效:

module_A.py:

import os
import sys

def func_from_module_A():
    print os.environ['LANG']
    print sys.path
    os._exit(0)  

main.py:

import os
import sys

def startProc_A():
    newpid = os.fork()
    if newpid == 0:   # this is the child process
        orig_env = os.environ['LANG']
        a_env = orig_env + 'something_else'
        os.environ['LANG'] = a_env
        sys.path.append("road_to_nowhere")
        func_A()

def func_A():
    import module_A
    module_A.func_from_module_A()

startProc_A()