Warum kann ich `pip install lxml` nicht in einer virtuellen Umgebung zum Laufen bringen?

70

Hinweis: Ich verwende virtualenvwrapper.

Vor dem Aktivieren der virtuellen Umgebung:

$ pip install lxml
Requirement already satisfied (use --upgrade to upgrade): lxml in /usr/lib/python2.7/dist-packages  
Cleaning up...  

Nach dem Aktivieren der virtuellen Umgebung:

(test-env)$ pip install lxml
force/build/lxml/src/lxml/includes/etree_defs.h:9:31: fatal error: 
libxml/xmlversion.h: No such file or directory

compilation terminated.

error: command 'gcc' failed with exit status 1

----------------------------------------
Command /home/chaz/dev/envs/test-with-system-python-force/bin/python2
.7 -c "import setuptools;__file__='/home/chaz/dev/envs/test-with-
system-python-force/build/lxml/setup.py';exec(compile(open(__file__).
read().replace('\r\n', '\n'), __file__, 'exec'))" install --record 
/tmp/pip-bJ6Q_B-record/install-record.txt --single-version-externally
-managed --install-headers /home/chaz/dev/envs/test-env/include/site/python2.7 failed with error code 1 in 
/home/chaz/dev/envs/test-env/build/lxml
Storing complete log in /home/chaz/.pip/pip.log
Brian Dant
quelle
1
Ich verstehe irgendwie nicht, auf welche Weise dies eine spezifische Programmierfrage ist. IMHO, das gehört zu serverfault.com
Markus W Mahlberg
4
@MarkusWMahlberg Virtualenv ist ein äußerst verbreitetes Python-Dienstprogramm, das hauptsächlich von Programmierern während der Entwicklung und nicht von Systemadministratoren während der Bereitstellung verwendet wird. lxml ist sehr beliebt und diese Art von Problem ist nicht selten. Ich halte dies für ein Thema unter den Kriterien "Software-Tools, die üblicherweise von Programmierern verwendet werden".
Jeremy
@JeremyBanks Ich bin mir der virtuellen Umgebung sehr wohl bewusst. Aber ich denke, wir haben ein eher umweltbezogenes Problem und die Chancen, eine nützliche Antwort zu erhalten, sollten bei Serverfehlern viel höher sein.
Markus W Mahlberg

Antworten:

130

Sie haben wahrscheinlich bereits lxml auf Ihrem System installiert, möglicherweise aufgrund eines Systempakets. Somit pip install lxmlschlägt der erste Versuch ( ohne eine aktive virtuelle Umgebung) nicht fehl, sondern installiert ihn auch nicht. es macht wirklich nichts.

In einer virtuellen Umgebung werden die Systempakete standardmäßig ignoriert. Daher glaubt pip, dass lxml nicht installiert ist. Daher wird versucht, es in Ihrer virtuellen Umgebung zu installieren.

lxml enthält C-Module, die kompiliert werden müssen, um ordnungsgemäß installiert zu werden. Die Kompilierung dieser C-Module setzt jedoch voraus, dass bereits einige "Entwicklungsbibliotheken" installiert sind. Diese Entwicklungsbibliotheken sind C-Bibliotheken, nicht Python, und daher kann pip sie nicht automatisch aus dem Internet abrufen und für Sie installieren.

Daher müssen Sie diese Entwicklungsbibliotheken selbst installieren, höchstwahrscheinlich mithilfe Ihres Paketmanagers. In einem Debian-System (wie Ubuntu) ist dies ...

apt-get install libxml2-dev libxslt-dev

Dadurch werden die Entwicklungsbibliotheken libxml2 und libxslt auf Ihrem lokalen System installiert. Wenn Sie erneut versuchen, lxml zu installieren, sollte der Kompilierungsschritt des C-Moduls funktionieren, da sich diese Entwicklungsbibliotheken jetzt auf Ihrem System befinden.

Die Fehlermeldung, die Sie erhalten haben, war darauf zurückzuführen, dass diese Bibliotheken fehlten (der libxml/xmlversion.h: No such file or directoryTeil der Fehlermeldung).

Siehe auch: So installieren Sie lxml unter Ubuntu

Mark Hildreth
quelle
1
Successfully installed lxml Vielen Dank! Ich bin gespannt, ob Sie einen Ort kennen, der die erforderlichen Header verschiedenen (beliebten) Python-Paketen zuordnet. Ich hatte auch Probleme mit anderen. Bekommt der apt-get python-dev nur Header für die Standardbibliothek?
Brian Dant
3
Beste Wette: Durchsuchen Sie Google nach der fehlenden Header-Datei und hoffen Sie, dass jemand anderes das gleiche Problem hat. Ja, mit Python-Dev erhalten Sie nur Header für die Standardbibliothek. libxml2-dev hat nichts mit Python zu tun: libxml2 ist eine C-Bibliothek, mit der Sie gerade eine Python-Bibliothek verwenden. Aus diesem Grund wurde es bei der Installation von python-dev nicht installiert. Andernfalls müssten Sie grundsätzlich jede existierende C-Bibliothek auf der Welt installieren, um sicherzustellen, dass Sie über alle Header verfügen, die Sie benötigen, damit jede Python-Bibliothek (z. B. lxml) ohne zusätzliche Schritte funktioniert
Mark Hildreth,
1
Hallo! Was ist, wenn ich die Entwickler nicht installieren kann? Ich bin kein Administrator der Maschine und ich brauche das jetzt dringend. Danke
Oussama L.
@ozama Ich würde empfehlen, dass Sie Ihre Situation in einer neuen Frage beschreiben, die andere beantworten können.
Mark Hildreth
19

für Centos-Benutzer: beim Erhalten von:

Fehler: Befehl 'gcc' mit Exit-Status 1 fehlgeschlagen

TUN:

sudo yum install libxslt-devel libxml2-devel
Elad Silber
quelle
5

Wenn Sie lxmlauf Systemebene installiert haben und es in ein Verzeichnis migrieren möchten, mit virtualenvdem Sie es nicht erstellt haben --system-site-packages, können Sie es in den Ordner Ihres virtualenvBenutzers dist-packageseinbinden.

Außerhalb Ihrer virtualenv, in einer Python-Shell:

import lxml
print lxml.__file__

In meinem Fall ist es in gefunden /usr/lib/python2.7/dist-packages. Es wird einen lxml-Ordner und eine Ei-Info-Datei geben. Wo immer sich Ihre virtuelle Umgebung befindet, gehen Sie in ihren /lib/python-x.y/dist-packagesOrdner (den Sie möglicherweise erstellen müssen dist-packages) und verknüpfen Sie sowohl den Bibliotheksordner als auch das Ei damit.

David Oliver
quelle
-1

Sie suchen höchstwahrscheinlich danach: Microsoft Visual C ++ 14.0 ist erforderlich (vcvarsall.bat kann nicht gefunden werden)

Suchen Sie nach der Visual Studio-Website und gehen Sie unten zu: "Tools for Visual Studio". Erweitern Sie sie, indem Sie auf klicken. Wählen Sie oben neben "Build Tools for Visual Studio 2017" die Option "Download".

NamasteJasutin
quelle
Ähm, OP verwendet eindeutig eine Version von Unix oder Linux, nicht Microsoft Windows…
Tom Zych