使用 apt-get 将包安装到 virtualenv

Rom*_*man 17 apt software-installation pip

根据这个答案,在apt-get系统范围内安装软件包(来自规范),并且只能pip将软件包安装到 virtualenv(来自 Pypi)。

但是,我需要将一个包安装到只能通过 访问的 virtualenv 中apt-get,即不由 Pypi 托管。

我怎么做?

And*_*ier 9

另一种选择是使用 下载文件apt-get download,使用 提取它dpkg -x并将提取的文件移动到您的 virtualenv:

例子:

apt-get download python-xyz
Run Code Online (Sandbox Code Playgroud)

假设这导致:

./python-xyz_1.2.3-3ubuntu5_amd64.deb
Run Code Online (Sandbox Code Playgroud)

然后,使用 dpkg 提取 .deb 文件的数据部分:

dpkg -x python-xyz_1.2.3-3ubuntu5_amd64.deb ./xyz-tmp
Run Code Online (Sandbox Code Playgroud)

在新创建的./xyz-tmp目录中,您现在拥有/使用apt-get install.

假设它们是:

./xyz-tmp/usr/lib/python2.7/dist-packages/xyz/
./xyz-tmp/usr/lib/python2.7/dist-packages/xyz-1.2.3.egg-info
Run Code Online (Sandbox Code Playgroud)

您仍然需要映射子目录(例如dist-packagesvs. site-packages),然后可以将文件移动到您的 virtualenv (假设是 virtualenv /home/user/.virtualenvs/py27):

mv ./xyz-tmp/usr/lib/python2.7/dist-packages/* /home/user/.virtualenvs/py27/lib/python2.7/site-packages/
Run Code Online (Sandbox Code Playgroud)

与我之前的答案相比,这种方法的优点是您不必研究安装了哪些文件,因为您可以在提取目录中看到它们。它仍然需要提取的存档和 virtualenv 之间的目录映射。


And*_*ier 0

virtualenv 所需要的只是 virtualenv 子树中存在包文件。因此,只要您可以确定哪些文件通过 apt-get 安装到了 Python 系统中,您就可以将它们复制到您的 virtualenv 中。这包括站点包目录中的文件以及 Python 子树中其他位置的文件(例如脚本)。

假设的例子:

sudo apt-get python-xyz
Run Code Online (Sandbox Code Playgroud)

假设它在你的系统 Python 2.7 中安装了一个名为“xyz”的包,你可能会得到这样的信息:

/usr/lib/python2.7/dist-packages/xyz/
/usr/lib/python2.7/dist-packages/xyz-1.2.3.egg-info
Run Code Online (Sandbox Code Playgroud)

将与“xyz”包相关的文件复制到您的 virtualenv (假设是 virtualenv /home/user/.virtualenvs/py27):

/home/user/.virtualenvs/py27/lib/python2.7/site-packages/xzy/
/home/user/.virtualenvs/py27/lib/python2.7/site-packages/xzy-1.2.3.egg-info
Run Code Online (Sandbox Code Playgroud)

困难在于 (1) 确定哪些文件属于特定包,以及 (2) 在系统 Python 和 virtualenv 之间映射相应的子目录(例如,dist-packagessite-packages上面的示例相比)。

如果有人对此有更多经验,请发表评论。