0

我正在使用python multiprocessing模塊在單獨的進程中調用python函數,並且我想爲此進程的環境變量$LD_LIBRARY_PATH設置不同的值。 特別是,我需要在進程引用它之前將字符串追加到現有值。示例代碼如下所示:python 3.4多處理 - 更改不同進程的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 

在打印語句中,我可以看到os.environ['LD_LIBRARY_PATH']是否已正確更新,然而,我的進程仍然參照值,它已當蟒蛇開始,這意味着該module_A仍然指舊LD_LIBRARY_PATH

有沒有辦法在腳本中動態更新此值。

RSVP。由於

+0

什麼'打印( multiprocessing.get_start_method())'在標準輸出上打印? – noxdafox

回答

1

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

」 ......這樣的變化對環境的影響開始 使用os.system(),POPEN()或叉子過程()和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() 

(編輯)還有以下確實出現了工作:

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

感謝您的及時答覆,但它不適合我。雖然環境正在更新正確,func_A()中的導入語句仍然針對舊環境 –

+1

@SaranshKejriwal好的,我添加了另一種方法(我認爲)遵循您正在使用的導入模式,它似乎適用於我。如果不適合你,你可以發佈一些鏈接到一些非工作代碼,我會看看嗎?如 –