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

时间:2014-03-31 20:08:30

标签: python mysql shared-libraries virtualenv mysql-python

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

2 个答案:

答案 0 :(得分:7)

我知道这个问题有点陈旧,但我很乐意分享我的解决方案,因为它没有通过谷歌找到它:

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 {1}}设置为空字符串。

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

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

答案 1 :(得分:3)

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

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

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

我可以看到缺点:

  • 不能与virtualenv的停用

  • 完美配合
  • 如果您想使用标准的distutils setup.py分发您的软件包,那将无济于事。