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