如果全局设置,如何加载共享库需求冲突的两个不同Python模块

2024-09-27 21:34:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在从事一个需要同时使用两个python模块的项目:

按照install PyMesh from source的说明操作之后,我成功地使用了我的Python 3.8解释器(在Ubuntu18上)

然后我下载并安装了PyRep。这最初不起作用,并出现错误:

    ~/.local/lib/python3.8/site-packages/pyrep/backend/sim.py in <module>
      1 from .simConst import *
----> 2 from ._sim_cffi import ffi, lib
      3 import numpy as np
      4 import collections
      5 

ImportError: libcoppeliaSim.so.1: cannot open shared object file: No such file or directory

PyRep的安装说明中说,这是因为我需要确保PyRep能够访问本地CoppeliaSim安装中的共享库,并且我应该在.bashrc中添加以下行:

export COPPELIASIM_ROOT=EDIT/ME/PATH/TO/COPPELIASIM/INSTALL/DIR
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$COPPELIASIM_ROOT
export QT_QPA_PLATFORM_PLUGIN_PATH=$COPPELIASIM_ROOT

成功!我可以{}没有问题。但是,如果现在再次导入pymesh,则会出现错误:

~/.local/lib/python3.8/site-packages/pymesh2-0.3-py3.8-linux-x86_64.egg/pymesh/Mesh.py in <module>
      3 import numpy as np
      4 
----> 5 import PyMesh
      6 
      7 class Mesh(object):

ImportError: /home/craig/Programs/CoppeliaSim/libtbb.so: file too short

通过按照建议在bash登录时全局设置$LD_LIBRARY_PATH,我已经使pymesh在coppeliasim根文件夹中搜索冲突的共享库!(寻找解决方案,我发现an article which condems changing ^{} in .bashrc for exactly this reason

我如何解决这个难题?PyRep要求我向LD_LIBRARY_路径添加一个目录,但如果我这样做,PyMesh就会中断(尽管我可以让每个目录单独工作)

尝试的替代方案

通过研究这个问题,我了解到可以使用patchelf命令更改特定共享库查找依赖项的位置。因此,我尝试手动调整有问题的PyRep_sim_cffi库的位置:

patchelf --set-rpath "/home/craig/Programs/CoppeliaSim" ~/.local/lib/python3.8/site-packages/pyrep/backend/_sim_cffi.cpython-38-x86_64-linux-gnu.so

但是,这只会导致向下一级出现可传递依赖项错误:

~/.local/lib/python3.8/site-packages/pyrep/backend/sim.py in <module>
      1 from .simConst import *
----> 2 from ._sim_cffi import ffi, lib
      3 import numpy as np
      4 import collections
      5 

ImportError: libQt5SerialPort.so.5: cannot open shared object file: No such file or directory

Tags: pathinfromimportlibpackageslocalsite
2条回答

我在以前的帖子上读了一些关于pipx的文章,这可能是一个潜在的解决方案

我给你留下一些信息

You can try using pipx.

pipx will do all the work of setting up separate virtual environments for each application, so that all the applications' dependencies remain separate.

If you use virtualenv yourself, you have to switch environments to run a different application. pipx handles the environment for you, so you don't have to mess with the virtualenvs at all.

From the docs:

pipx is made specifically for application installation, as it adds isolation yet still makes the apps available in your shell: pipx creates an isolated environment for each application and its associated packages.

来源:stackoverflow's @jpyams

希望这有用;)

我能想到的第一件事是创建一个虚拟环境,并使用它来安装软件包。但问题仍然存在,因为问题在于两个包之间的共享路径。有些事情你可以试试:

  • 创建一个shell脚本来设置LD_LIBRARY_路径,为PyRep执行pip安装。然后运行脚本

    MyScript.sh

     #!/bin/bash
     export COPPELIASIM_ROOT=EDIT/ME/PATH/TO/COPPELIASIM/INSTALL/DIR
     export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$COPPELIASIM_ROOT
     export QT_QPA_PLATFORM_PLUGIN_PATH=$COPPELIASIM_ROOT
    
     pip3 install -r requirements.txt
     python3 setup.py install  user
    

    运行脚本

     ./MyScript
    
  • 您还可以为运行的命令设置环境变量,如下所示

    MyScript.sh

     pip3 install -r requirements.txt
     python3 setup.py install  user
    

    运行脚本

    $ env LD_LIBRARY_PATH=$LD_LIBRARY_PATH:EDIT/ME/PATH/TO/COPPELIASIM/INSTALL/DIR ./MyScript
    

上述解决方案将确保仅在尝试安装PyRep时设置相应的LD_LIBRARY_路径,并且PyMesh不会出现后续路径问题

相关问题 更多 >

    热门问题