【问题标题】:Python Multiprocessing not honoring LD_LIBRARY_PATH for dynamic loadingPython 多处理不支持动态加载的 LD_LIBRARY_PATH
【发布时间】: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


    【解决方案1】:

    我假设是因为动态加载器不会重新读取 分叉后的 LD_LIBRARY_PATH 变量

    没错,当您调用putenv 时,动态链接器已经解析了LD_LIBRARY_PATH 并构建了它的内部表来解析符号。没有exec,你将无法重建那些。

    你也可以

    • 在启动时,查看路径是否已设置,如果未设置,请设置它们并重新exec 脚本
    • 将工作脚本更改为独立的,以便它们可以是exec-ed 而不是fork-ed
    • 设置LD_LIBRARY_PATH 启动您的主应用程序
    • 使用绝对路径通过dlopen 手动加载所需的库

    【讨论】:

    • 好的,我假设没有办法在运行时与动态加载器进行通信,它应该添加另一个搜索路径?
    • @MaxEhrlich 不幸的是没有。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-17
    相关资源
    最近更新 更多