根据这个答案,apt-get
在系统范围内安装软件包(来自规范),并且只能pip
将软件包安装到虚拟环境中(来自 Pypi)。
但是,我需要将一个包安装到只能通过访问的虚拟环境中apt-get
,即不由 Pypi 托管。
我怎么做?
答案1
另一种方法是使用 下载文件apt-get download
,使用 提取文件dpkg -x
,然后将提取的文件移动到你的虚拟环境:
例子:
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
会安装到(根目录)的所有文件。/
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-packages
vs. site-packages
),然后将文件移动到您的虚拟环境中(假设是虚拟环境/home/user/.virtualenvs/py27
):
mv ./xyz-tmp/usr/lib/python2.7/dist-packages/* /home/user/.virtualenvs/py27/lib/python2.7/site-packages/
与我之前的回答相比,这种方法的优点是您不必研究安装了哪些文件,因为您可以在提取目录中看到它们。它仍然需要在提取的存档和虚拟环境之间进行目录映射。
答案2
虚拟环境所需的只是虚拟环境子树中存在软件包文件。因此,只要您能确定哪些文件已通过 apt-get 安装到系统 Python 中,您就可以将这些文件复制到虚拟环境中。这包括站点软件包目录中的文件以及 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 /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 和虚拟环境之间映射相应的子目录(例如上面例子中的dist-packages
vs. )。site-packages
如果有人对此有更多经验,请发表评论。