【发布时间】:2017-03-21 15:30:00
【问题描述】:
我正在开发一个使用多处理的 python 3.5 项目,工作进程需要能够调用已编译的 MATLAB 代码。为了不必在运行 python 之前设置 LD_LIBRARY_PATH 环境变量(它会导致与 libexpat 冲突),我只想让这个工作进程使用更改后的 LD_LIBRARY_PATH。我认为这可以正常工作,因为使用 fork() 创建的进程是在父级中进行的任何环境更改启动的。我正在使用
matlab_runtime_paths = [
'/usr/local/MATLAB/MATLAB_Runtime/v91/runtime/glnxa64',
'/usr/local/MATLAB/MATLAB_Runtime/v91/bin/glnxa64',
'/usr/local/MATLAB/MATLAB_Runtime/v91/sys/os/glnxa64',
'/usr/local/MATLAB/MATLAB_Runtime/v91/sys/opengl/lib/glnxa64'
]
system_lib_dir = '{}/lib'.format(sys.prefix)
lib_paths = matlab_runtime_paths + [system_lib_dir]
lib_paths_format = ':'.join(lib_paths)
os.putenv('LD_LIBRARY_PATH', lib_paths_format)
在父进程中设置环境变量,然后在工作进程中设置
def matlab_worker(matlab_pipe_end):
import service
service.initialize_stub()
因为无法正确找到库而崩溃。我可以看到环境变量设置正确,如果我添加
def matlab_worker(matlab_pipe_end):
os.system('echo $LD_LIBRARY_PATH')
import service
service.initialize_stub()
变量设置好了,我什至可以做
def matlab_worker(matlab_pipe_end):
os.system('ldd <path>/service.so')
import service
service.initialize_stub()
并看到所有共享对象都已解析,但 python 未能遵守此设置,在导入时崩溃。我假设是因为动态加载器在分叉后没有重新读取 LD_LIBRARY_PATH 变量(这可能是正确的吗?听起来不正确,但我找不到任何关于它的文档)
有什么方法可以做我想做的事,还是我的代码有问题?我应该注意,如果父进程是使用LD_LIBRARY_PATH=... 启动的,并且我已确保不存在可能会破坏进程的冲突库,则此代码可以正常工作。
【问题讨论】:
标签: python matlab shared-libraries python-multiprocessing