Install package into virtualenv using apt-get
According to this answer, apt-get installs packages system-wide (from canonical), and only pip can install packages into a virtualenv (from Pypi).
However, I need to install a package into a virtualenv that is only accessible via apt-get, i.e. is not hosted by Pypi.
How do I do that?
12 Answers
Another alternative is to download the file with apt-get download, extract it with dpkg -x and to move the extracted files to your virtualenv:
Example:
apt-get download python-xyzassume this results in:
./python-xyz_1.2.3-3ubuntu5_amd64.debThen, use dpkg to extract the data portion of the .deb file:
dpkg -x python-xyz_1.2.3-3ubuntu5_amd64.deb ./xyz-tmpIn the newly created ./xyz-tmp directory, you now have all files that would have been installed to / (root) had you used apt-get install.
Assume they are:
./xyz-tmp/usr/lib/python2.7/dist-packages/xyz/
./xyz-tmp/usr/lib/python2.7/dist-packages/xyz-1.2.3.egg-infoYou still need to map the subdirectories (e.g. dist-packages vs. site-packages), and can then move the files into your virtualenv (assuming a virtualenv /home/user/.virtualenvs/py27):
mv ./xyz-tmp/usr/lib/python2.7/dist-packages/* /home/user/.virtualenvs/py27/lib/python2.7/site-packages/Compared to my previous answer, this approach has the advantage that you don't have to research which files got installed, because you can see them in the extraction directory. It still requires a mapping of directories between the extracted archive and the virtualenv.
1All that is needed for a virtualenv is the presence of the package files in the subtree of your virtualenv. So as long as you can determine which files got installed into the system Python via apt-get, you can copy those into your virtualenv. This includes files in the site packages directory as well as in other places within your Python subtree (e.g. scripts).
Hypothetical example:
sudo apt-get python-xyzAssume it installs a package named "xyz" into your system Python 2.7, you may get this:
/usr/lib/python2.7/dist-packages/xyz/
/usr/lib/python2.7/dist-packages/xyz-1.2.3.egg-infoCopy the files related to the "xyz" package to your virtualenv (assuming a 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-infoThe difficulty is (1) in determining which files belong to a particular package, and (2) in mapping corresponding subdirectories between the system Python and the virtualenv (e.g. dist-packages vs. site-packages in the example above).
If anyone has more experience with this, please comment.
0