首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何加载两个不同的Python模块,如果全局设置它们的共享库需求冲突

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

Stack Overflow用户
提问于 2020-09-22 20:47:09
回答 2查看 541关注 0票数 3

我正在进行一个项目,在这个项目中,我需要同时使用两个python模块:

在遵循了对从源安装PyMesh的说明之后,我成功地使用了Python3.8解释器(在Ubuntu 18上)完成了import pymesh

然后我下载并安装了PyRep。这在一开始不起作用,并给出了错误:

代码语言:javascript
复制
    ~/.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中添加以下行:

代码语言:javascript
复制
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

成功!我可以import pyrep没有问题。但是,如果我现在再次导入pymesh,则会得到一个错误:

代码语言:javascript
复制
~/.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在Coppelia-Sim根文件夹中搜索冲突的共享库!(为了寻找解决方案,我找到了在.bashrc中,正是出于这个原因)

我该怎么解决这个问题?PyRep要求我向LD_LIBRARY_PATH添加一个目录,但是如果我这样做,PyMesh会中断(尽管我可以让每个目录单独工作)。

尝试替代方案

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

代码语言:javascript
复制
patchelf --set-rpath "/home/craig/Programs/CoppeliaSim" ~/.local/lib/python3.8/site-packages/pyrep/backend/_sim_cffi.cpython-38-x86_64-linux-gnu.so

但是,这只会导致传递的依赖错误降低一级:

代码语言:javascript
复制
~/.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
EN

回答 2

Stack Overflow用户

发布于 2020-09-29 14:19:51

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

我给你留了些信息。

您可以尝试使用pipx。 pipx将完成为每个应用程序设置单独的虚拟环境的所有工作,以便所有应用程序的依赖关系保持独立。 如果您自己使用virtualenv,则必须切换环境以运行不同的应用程序。pipx为您处理环境,因此您根本不需要处理虚拟环境。 从医生那里: pipx是专门为应用程序安装而制作的,因为它增加了隔离,但仍然使应用程序在shell中可用: pipx为每个应用程序及其相关包创建了一个独立的环境。

来源:https://stackoverflow.com/a/52955897/14325407

希望这是有用的;)

票数 0
EN

Stack Overflow用户

发布于 2020-10-05 09:17:49

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

  • 创建一个shell脚本来设置LD_LIBRARY_PATH,为PyRep执行一个pip安装。那就运行脚本。 MyScript.sh #!/bin/bash导出COPPELIASIM_ROOT=EDIT/ME/PATH/TO/COPPELIASIM/INSTALL/DIR导出LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$COPPELIASIM_ROOT导出QT_QPA_PLATFORM_PLUGIN_PATH=$COPPELIASIM_ROOT pip3 -r requirements.txt python3 setup.py安装--用户 运行脚本 ./MyScript
  • 还可以为正在运行的命令设置环境变量,如下所示 MyScript.sh pip3 -r requirements.txt python3 setup.py安装-用户 运行脚本 $ env LD_LIBRARY_PATH=$LD_LIBRARY_PATH:EDIT/ME/PATH/TO/COPPELIASIM/INSTALL/DIR ./MyScript

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64017475

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档