2014-03-31 37 views
5

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

回答

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分布也无济于事。

5

我知道这个问题是有点老了,但我很乐意分享我的不足通过谷歌找到它的解决方案:

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设置为EMP它错误地计算结果为假现有的复位脚本ty字符串。

然后,下面的deactivate()功能,添加以下部分:

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