【问题标题】:How to manage python project that depends on multiple versions of a shared library?如何管理依赖于多个版本的共享库的python项目?
【发布时间】:2020-01-16 19:14:46
【问题描述】:

我在 macOS 上,使用 brewpyenvvirtualenv

我有一个依赖于bokehgdal 的Python 项目(这两个python 包都使用pip 在虚拟环境中安装)。 bokeh 和 gdal 都依赖于libopenssl 的系统版本,但它们依赖于不同的版本(1.0 和 1.1)。

我在过去的不同时间点让这个项目工作过,使用了一些库组合(对所有 python 包使用 pip,对系统包使用 brew),但是当我更改 python 版本和环境(使用 pyenv)以处理其他库时项目,然后回到这个项目,它不再有效。通常在为 openssl 找到共享库时遇到问题:

$ ./my_python_program.py
...
ImportError: dlopen(/Users/userBob/.pyenv/versions/3.7.0/lib/python3.7/lib-dynload/_ssl.cpython-37m-darwin.so, 2): 
Library not loaded: /usr/local/opt/openssl@1.1/lib/libssl.1.1.dylib
Referenced from: /Users/userBob/.pyenv/versions/3.7.0/lib/python3.7/lib-dynload/_ssl.cpython-37m-darwin.so
Reason: image not found

我觉得我最终能够通过尝试使用 pip 和 brew 安装和卸载各种软件包版本的随机组合来让事情正常工作。但这是维护我的项目的一种脆弱且低效的方式。

一般来说,处理这种情况的最佳方法是什么?我是否需要简单地记录准确的 brew 和 pip install/uninstall 命令才能使其正常工作?我是否缺少版本“固定”的概念?我是否缺少 brew 和 pyenv 的其他选项可以使这个过程更容易?

【问题讨论】:

  • 我很困惑,Bokeh 不依赖于 openSSL。
  • 哎呀,也许我用不同的库搞砸了,或者散景依赖于依赖于 openssl 的东西?
  • Bokeh 的依赖列表很短。唯一可能想到的是龙卷风。也许尝试更新更改您安装的 Tornado 版本?
  • 是的,既然你提到了它,那就是龙卷风。我想我正在对某种我缺少的模式或策略进行更一般的回答:管理依赖项。每次切换项目时,我都会进入一个未知长度的循环,安装不同版本的不同包,我想我一定错过了更好的跟踪/管理情况的方法。
  • 您是否考虑过用 Anaconda(和 conda 环境)替换 brew、pyenv 和 virtualenv?anaconda.com/distribution

标签: python pip openssl homebrew bokeh


【解决方案1】:

我不确定这是不是最好的方法,但我可以告诉你我通常做什么。

  • 首先,我使用的是 Anaconda。
  • 当我在做一个项目时,我会切换到相关的虚拟环境。
  • 在切换出去之前,当我提交/推送我的修改时,我还会创建我的环境的导出文件like you can find it there
  • 我也用 git 跟踪这个文件,这样,如果我在环境中进行任何修改,它就会存储在 .yml 文件中。

这样,如果我格式化我的机器或获得新的机器等,我可以重新安装项目所需的所有依赖项。我需要的每个依赖项的引用都与我的源一起存储在云中。因此,如果我开始出现奇怪的行为,我只需使用此参考文件从它工作时恢复我的环境。

我在项目之间切换的速度不够快,不足以证明自动化这个过程是合理的,但我相信如果你愿意,这是可行的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-08
    • 1970-01-01
    • 2020-07-24
    • 2013-06-22
    • 1970-01-01
    • 2018-07-14
    相关资源
    最近更新 更多