2015-06-26 106 views
0

我试图在virtualenv中运行pip install libarchive,但它失败:在Debian上的virtualenv中共享库; PIP安装失败

(.env) $ pip install libarchive 
Downloading/unpacking libarchive 
    Downloading libarchive-0.4.3.tar.gz 
    Running setup.py egg_info for package libarchive 
Requirement already satisfied (use --upgrade to upgrade): nose in /var/tmp/.env/lib/python2.6/site-packages (from libarchive) 
Installing collected packages: libarchive 
    Running setup.py install for libarchive 
    Verifying that the library is accessible. 
    Library can not be loaded: libarchive.so: cannot open shared object file: No such file or directory 
    error: None 
    Complete output from command /var/tmp/.env/bin/python -c "import setuptools; 
__file__='/var/tmp/.env/build/libarchive/setup.py'; execfile('/var/tmp/.env/build/libarchive/setup.py')" install --single-version-externally-managed --record /tmp/pip-1hz9vY-record/install-record.txt --install-headers /var/tmp/.env/include/site/python2.6: 
    running install 

Verifying that the library is accessible. 

Library can not be loaded: libarchive.so: cannot open shared object file: No such file or directory 

error: None 

---------------------------------------- 
Command /var/tmp/.env/bin/python -c "import setuptools; __file__='/var/tmp/.env/build/libarchive/setup.py'; execfile('/var/tmp/.env/build/libarchive/setup.py')" install --single-version-externally-managed --record /tmp/pip-1hz9vY-record/install-record.txt --install-headers /var/tmp/.env/include/site/python2.6 failed with error code 1 
Storing complete log in /home/me/.pip/pip.log 

的错误信息是不是非常有帮助,但我想这个问题是二进制包libarchive13(或者,适用于Debian挤压,libarchive1)没有安装。

我没有这个系统的安装权限(更少root),并且需要能够部署到用户处于类似困境的系统。有没有办法做到这一点?

(该libarchive documentation表明,有与.so符号链接Ubuntu的问题,但这种情况正在发生Debian的 - 反正,我无法找到有关这一争端的任何公共bug报告有关,但切 - 安装软件包后,我可能需要额外的解决方法。)

回答

0

不是一个真正的答案,而是一个可能的解决方法的开始。

对于每个需要的库,请下载本地.deb并解压缩,然后将必要的文件复制到virtualenv中。我在这里采取了一个快捷方式,简单地省略了手册usr/share/doc等。(当然,本地存储并不一定要在virtualenv树中,当然 - 在任何你有写入权限的地方都可以,但是这对于保持它在virtualenv中)

vnix$ mkdir -p debs/x 

vnix$ fakeroot apt-get install -y --print-uris libarchive13 | 
> sed -n "s!.*'\(http://[^' ]*\.deb\)'.*!\1!p" | 
> xargs -r wget -nc -P debs 

vnix$ for deb in debs/*.deb; do 
> dpkg -x "$deb" debs/x 
> done 

vnix$ mv debs/x/lib/* debs/x/usr/lib/* virtualenv/lib 

# Then finally 
vnix$ export LD_LIBRARY_PATH=$PWD/virtualenv/lib${LD_LIBRARY_PATH+:$LD_LIBRARY_PATH} 

最后一部分也许应该添加到您的activate脚本,因为这里建议:virtualenv that can find relocated libraires (like mysqlclient lib for MySQLdb)

仅仅复制图书馆在LD_LIBRARY_PATH目录显然是唯一可行的极其简单库。例如,如果deb程序包包含postinst脚本或其他某些配置操作,或者包含硬编码/usr文件系统中的位置的代码,则显然会失败。

(该fakeroot apt-get install --print-uris业务是非常难看,但我找不到更好的办法来递归地从一个定义良好的本地配置的Debian镜像站点下载的依赖性。请注意,它可以下载多个软件包)。

+0

先粗在https://github.com/tripleee/virtualdeb;拉请求比欢迎。 – tripleee