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

joe*_*tde 8 python mysql shared-libraries virtualenv mysql-python

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

Tho*_*her 8

我知道这个问题有点陈旧,但我很乐意分享我的解决方案,因为它缺乏通过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
Run Code Online (Sandbox Code Playgroud)

请注意,我正在使用一个否定-z表达式 - 现有的重置脚本for PATHPYTHONHOMEuse -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
Run Code Online (Sandbox Code Playgroud)


joe*_*tde 3

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

echo 'export LD_LIBRARY_PATH=/path/to/lib:$LD_LIBRARY_PATH' >> /path/to/virtualenv/activate
Run Code Online (Sandbox Code Playgroud)

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

我看到的缺点:

  • 与 virtualenv 的 deactivate 配合不好

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