【问题标题】:iPython: imported module can't find its shared librariesiPython:导入的模块找不到它的共享库
【发布时间】:2014-11-17 15:34:29
【问题描述】:

在 iPython 中,我导入了一个模块,该模块又导入了另一个模块。这另一个模块(即 gurobipy)试图加载它的共享库,但失败了。共享库的路径添加到.bashrc 中的LD_LIBRARY_PATH。当我从 shell 以脚本的形式运行整个事情时,一切都很好。

我搜索了一段时间,但没有找到问题的最终答案:如何在 iPython 中设置 LD_LIBRARY_PATH 以便导入的模块可以看到它?

我尝试了 os.environ 但仍然收到相同的错误消息:ImportError: libgurobi50.so: cannot open shared object file: No such file or directory

编辑:我使用的是 Ubuntu 13.04。

【问题讨论】:

  • 你是如何开始 IPython 的?如果从终端启动它,它应该获得相同的环境变量。您应该能够使用os.environ 修改环境变量。
  • 是的,我忘了提。我从 Unity 启动器开始。没错,从终端启动时,它可以工作。我可以使用 os.environ 修改 LD_LIBRARY_PATH。但是,当我然后导入模块时,它仍然找不到库。
  • 可能需要在进程开始之前设置 LD_LIBRARY_PATH。

标签: python shared-libraries ipython gurobi


【解决方案1】:

尝试将 LD_LIBRARY_PATH 包含到系统范围的文件中。例如,/etc/profile(在它的末尾)。例如,这是我需要为我的案例添加的内容:

导出 NEVESIM_HOME=/home/kam/Applications/Nevesim

导出 LD_LIBRARY_PATH=${NEVESIM_HOME}/lib:${LD_LIBRARY_PATH}

注意语法。此外,您必须重新登录才能使更改生效。 如需更多帮助,请参阅https://help.ubuntu.com/community/EnvironmentVariables

【讨论】:

  • 我也在考虑这个问题。但是,我真的很想知道它是否可以在 python 脚本本身或 iPython shell 中完成。
【解决方案2】:

运行时库路径在 python(或 IPython)解释器启动时配置。 Read this.

似乎 ctypes 之类的工具在搜索库时使用此路径。同样,如果一个模块依赖于一个特定的库,它会在导入或运行时搜索此路径。

这适用于任何进程,而不仅仅是 IPython。您不能只在进程运行时更改加载程序路径。 Also read this.

如果你仔细想想,那真是一件好事。它可能会导致各种问题。突然之间,进程找不到它需要的库,然后崩溃了。

这很不幸,因为这意味着 IPython 不能真正用作完整的 shell 替代品。

我不确定 BASH 等 shell 是如何处理这个问题的。我想 BASH 为自己使用一个运行时路径,并为在其中运行的进程导出另一个运行时路径。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-04-10
    • 2020-11-29
    • 2018-04-30
    • 1970-01-01
    • 1970-01-01
    • 2018-07-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多