简体   繁体   English

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

[英]python 3.4 multiprocessing - change ld_library_path for different processes

I'm using python multiprocessing module to call a python function in separate process, and I want a different value for the environment variable $LD_LIBRARY_PATH for this processes. 我正在使用python多处理模块在单独的进程中调用python函数,并且我希望该进程的环境变量$LD_LIBRARY_PATH具有不同的值。 Specifically, I need to append a string to the existing value before the process refers to it. 具体来说,我需要在流程引用它之前将字符串附加到现有值。 An example code is shown below: 示例代码如下所示:

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

In the print statement, I can see that os.environ['LD_LIBRARY_PATH'] has been correctly updated, however, my process is still referring to the value that it had when python was started , meaning that module_A is still referring to the old LD_LIBRARY_PATH 在print语句中,我可以看到os.environ['LD_LIBRARY_PATH']已正确更新,但是, 我的进程仍在引用python启动时的值,这意味着module_A仍在引用旧的LD_LIBRARY_PATH

Is there a way to update this value dynamically within the script. 有没有一种方法可以在脚本中动态更新此值。

RSVP. 敬请回复。 Thanks 谢谢

The documentation for os.putenv() includes the text: os.putenv()的文档包括以下文本:

"... Such changes to the environment affect subprocesses started with os.system(), popen() or fork() and execv()" “ ...对环境的此类更改会影响以os.system(),popen()或fork()和execv()开头的子流程”

So, you can do it like this: 因此,您可以这样做:

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()

... or (maybe better) after the fork() call, like this: ...或(也许更好)在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) Also the following does appear to work: (编辑)以下似乎也起作用:

module_A.py: module_A.py:

import os
import sys

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

main.py: 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()

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM