Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python多处理不支持动态加载的LD_库_路径_Python_Matlab_Shared Libraries_Python Multiprocessing - Fatal编程技术网

Python多处理不支持动态加载的LD_库_路径

Python多处理不支持动态加载的LD_库_路径,python,matlab,shared-libraries,python-multiprocessing,Python,Matlab,Shared Libraries,Python Multiprocessing,我正在从事一个使用多处理的Python3.5项目,工作进程需要能够调用编译后的MATLAB代码。为了在运行python之前不必设置LD_LIBRARY_PATH环境变量(它会导致与libexpat冲突),我只希望这个工作进程使用修改后的LD_LIBRARY_路径。我认为这很好,因为使用fork()创建的进程是在父进程中进行任何环境更改后启动的。我正在使用 matlab_runtime_paths = [ '/usr/local/MATLAB/MATLAB_Runtime/v91/runt

我正在从事一个使用多处理的Python3.5项目,工作进程需要能够调用编译后的MATLAB代码。为了在运行python之前不必设置LD_LIBRARY_PATH环境变量(它会导致与libexpat冲突),我只希望这个工作进程使用修改后的LD_LIBRARY_路径。我认为这很好,因为使用
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()
def matlab_worker(matlab_管道端):
操作系统('ldd/service.so')
进口服务
service.initialize_stub()
并确保所有共享对象都已解析,但python未能遵守此设置,导致导入崩溃。我这样假设是因为动态加载程序不会在fork之后重新读取LD_LIBRARY_PATH变量(这是正确的吗?听起来不正确,但我找不到任何关于它的文档)

是否有任何方法可以实现我想要的,或者我的代码是否有问题?我应该注意,如果父进程是使用
LD\u LIBRARY\u PATH=…
启动的,那么该代码可以正常工作,并且我已经确保没有冲突的库可能会破坏进程

我假设是因为动态加载程序不会重新读取 fork后面的LD_LIBRARY_PATH变量

没错,当您调用
putenv
时,动态链接器已经解析了
LD_LIBRARY_PATH
并构建了用于解析符号的内部表。如果没有
exec
,您将无法重建这些文件

或者,你可以

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

好的,我假设没有办法在运行时与动态加载程序通信,它应该添加另一个搜索路径?@MaxEhrlich不幸的是,没有。