【问题标题】:shared library in a virtualenv on Debian; pip install failsDebian 上的 virtualenv 中的共享库;点安装失败
【发布时间】:2015-09-13 00:24:09
【问题描述】:

我试图在 virtualenv 中运行 pip install libarchive,但它失败了:

(.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 Squeeze,libarchive1)没有安装。

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

libarchive documentation 表明 Ubuntu 上的 .so 符号链接存在问题,但这发生在 Debian 上——无论如何,我无法找到任何关于此争议的公开错误报告。相关,但是切线——安装软件包后,我可能需要额外的解决方法。)

【问题讨论】:

    标签: python shared-libraries pip


    【解决方案1】:

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

    对于每个需要的库,下载一个本地的.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 镜像递归下载依赖项。请注意,它可能会下载多个包。)

    【讨论】:

    猜你喜欢
    • 2020-05-16
    • 2012-08-24
    • 1970-01-01
    • 2013-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-21
    • 2017-03-01
    相关资源
    最近更新 更多