virtualenv 可以找到重新定位的库(如 MySQLdb 的 mysqlclient lib)

Posted

技术标签:

【中文标题】virtualenv 可以找到重新定位的库(如 MySQLdb 的 mysqlclient lib)【英文标题】:virtualenv that can find relocated libraires (like mysqlclient lib for MySQLdb) 【发布时间】:2014-05-11 08:39:08 【问题描述】:

我希望能够共享一个自包含的 virtualenv,即确保安装的所有脚本都能够直接运行而无需设置任何内容。 例如。我在使用 mysql-python 的 virtualenv 中安装了一个脚本。不幸的是,导入 MySQLdb 会寻找一个共享库 (libmysqlclient.so),该库已移动到我系统上标准目录之外的其他位置。 有没有办法保证我的 virtualenv 每次有人使用它时都能找到该库?

【问题讨论】:

【参考方案1】:

这可能不是最好的解决方案,但你可以破解 virtualenv 活动脚本来设置一些环境变量(这是一个我们无论如何都需要使用的脚本)。 在virtualenv的安装脚本中,我添加了:

echo 'export LD_LIBRARY_PATH=/path/to/lib:$LD_LIBRARY_PATH' >> /path/to/virtualenv/activate

现在每次有人使用我的 virtualenv 时,它还包括 LD_LIBRARY_PATH 来查找 mysql 库。

我可以看到的缺点:

不能很好地使用 virtualenv 的 deactivate

如果您想使用标准 distutils setup.py 分发您的软件包,这将无济于事。

【讨论】:

【参考方案2】:

我知道这个问题有点老了,但我很乐意分享我的解决方案,因为无法通过 Google 找到它:

deactivate () 函数中,添加以下行:

    if ! [ -z $_OLD_LD_LIBRARY_PATH+x ] ; then
        LD_LIBRARY_PATH="$_OLD_LD_LIBRARY_PATH"
        export LD_LIBRARY_PATH
        unset _OLD_LD_LIBRARY_PATH
    fi

请注意,我使用的是否定的 -z 表达式 - PATHPYTHONHOME 的现有重置脚本使用 -n,如果 _OLD_LD_LIBRARY_PATH 设置为空字符串,则其计算结果错误为 false。

然后,在deactivate () 函数下方,添加以下部分:

_OLD_LD_LIBRARY_PATH="$LD_LIBRARY_PATH"
LD_LIBRARY_PATH="$VIRTUAL_ENV/lib:$LD_LIBRARY_PATH"
export LD_LIBRARY_PATH

【讨论】:

以上是关于virtualenv 可以找到重新定位的库(如 MySQLdb 的 mysqlclient lib)的主要内容,如果未能解决你的问题,请参考以下文章

虚拟环境virtualenv和virtualenvwrapper(转)

virtualenv与virtualenvwrapper

再见 virtualenv!K神教你轻松管理多个Python环境

安装和使用virtualenv

Python开发之virtualenv和virtualenvwrapper详解

[python] virtualenv和virtualenvwrapper管理python虚拟环境