使用apt-get将软件包安装到virtualenv


16

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

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

我怎么做?


好问题的朋友。
rɑːdʒɑ

Answers:


8

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

例:

apt-get download python-xyz

假定结果如下:

./python-xyz_1.2.3-3ubuntu5_amd64.deb

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

dpkg -x python-xyz_1.2.3-3ubuntu5_amd64.deb ./xyz-tmp

现在,在新创建的./xyz-tmp目录中,您将拥有使用过的所有已安装到/(root)的文件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

您仍然需要映射子目录(例如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/

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


+1,这是该方法的另一个示例,该方法非常有效地将只能通过APT访问的软件包安装到virtualenv中-最近使用Python 3.7做过类似的事情。
RichVel19年

0

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

假设的例子:

sudo apt-get python-xyz

假设它在系统Python 2.7中安装了一个名为“ xyz”的软件包,您可能会得到以下信息:

/usr/lib/python2.7/dist-packages/xyz/
/usr/lib/python2.7/dist-packages/xyz-1.2.3.egg-info

将与“ 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

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.