python 3.4多处理 - 为不同的进程更改ld_library_path

时间:2017-06-14 13:15:01

标签: python multiprocessing environment-variables python-3.4 python-multiprocessing

我正在使用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

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

RSVP。感谢

1 个答案:

答案 0 :(得分:1)

os.putenv()的documentation包含文字:

  

“......对环境的这种改变会影响子流程的开始   os.system(),popen()或fork()和execv()“

所以,你可以这样做:

bs, err := bcrypt.GenerateFromPassword([]byte("12345"), bcrypt.DefaultCost)
expected := bs

db.Create(&Member{MyField: bs})
var member Member

db.First(&member)
actual := member.MyField

if !bytes.Equal(actual, expected) {
    panic("fields are not equal")
}
在fork()调用之后

...或(或许更好),如下所示:

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

(编辑)以下似乎也有效:

module_A.py:

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

main.py:

import os
import sys

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