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
表达式 - 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
【讨论】:
以上是关于virtualenv 可以找到重新定位的库(如 MySQLdb 的 mysqlclient lib)的主要内容,如果未能解决你的问题,请参考以下文章
虚拟环境virtualenv和virtualenvwrapper(转)
再见 virtualenv!K神教你轻松管理多个Python环境