2014-03-31 35 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