【问题标题】:virtualenv that can find relocated libraires (like mysqlclient lib for MySQLdb)virtualenv 可以找到重新定位的库(如 MySQLdb 的 mysqlclient lib)
【发布时间】:2014-05-11 08:39:08
【问题描述】:
我希望能够共享一个自包含的 virtualenv,即确保安装的所有脚本都能够直接运行而无需设置任何内容。
例如。我在使用 MySQL-python 的 virtualenv 中安装了一个脚本。不幸的是,导入 MySQLdb 会寻找一个共享库 (libmysqlclient.so),该库已移动到我系统上标准目录之外的其他位置。
有没有办法保证我的 virtualenv 每次有人使用它时都能找到该库?
【问题讨论】:
标签:
python
mysql
shared-libraries
virtualenv
mysql-python
【解决方案1】:
这可能不是最好的解决方案,但你可以破解 virtualenv 活动脚本来设置一些环境变量(这是一个我们无论如何都需要使用的脚本)。
在virtualenv的安装脚本中,我添加了:
echo 'export LD_LIBRARY_PATH=/path/to/lib:$LD_LIBRARY_PATH' >> /path/to/virtualenv/activate
现在每次有人使用我的 virtualenv 时,它还包括 LD_LIBRARY_PATH 来查找 mysql 库。
我可以看到的缺点:
【解决方案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 表达式 - PATH 和 PYTHONHOME 的现有重置脚本使用 -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