Why can't I get `pip install lxml` to work within a virtualenv?
Solution 1:
You probably already have lxml installed on your system, perhaps installed due to a system package. Thus, the first attempt (pip install lxml
without an active virtualenv) doesn't fail, but it also doesn't install it; it really doesn't do anything.
In a virtualenv, by default, the system packages are ignored. Therefore, pip thinks that lxml is not installed. Therefore, it tries to install it into your virtual environment.
lxml contains C modules that need to be compiled in order to install properly. However, the compilation of those C modules rely on your having some "development libraries" already installed as well. These development libraries are C libraries, not Python, and as such pip won't be able to automatically fetch them from the internet and install them for you.
Therefore, you will need to install these development libraries on your own, most likely using your package manager. In a Debian system (like Ubuntu), this is...
apt-get install libxml2-dev libxslt-dev
This will install the libxml2 and libxslt development libraries to your local system. If you try again to install lxml, the C module compilation step should work because now these development libraries are on your system.
The error message you were receiving was due to the fact that these libraries were missing (the libxml/xmlversion.h: No such file or directory
part of the error message).
See also: How to install lxml on Ubuntu
Solution 2:
for centos users: when getting:
error: command 'gcc' failed with exit status 1
DO:
sudo yum install libxslt-devel libxml2-devel
Solution 3:
If you have lxml
installed at the system level, and want to migrate it into a virtualenv
that you didn't create with --system-site-packages
, you can symlink it into your virtualenv
's dist-packages
folder.
Outside your virtualenv
, in a python shell:
import lxml
print lxml.__file__
In my case, it's found in /usr/lib/python2.7/dist-packages
. There'll be an lxml folder and egg-info file. Wherever your virtualenv is, go into its /lib/python-x.y/dist-packages
folder (you may need to create dist-packages
), and symlink both the library folder and egg into it.