2013-01-09 39 views
7

Napisałem skrypt kilka razy temu, że zawierająbłąd importu dla lxml w python

from lxml import etree 

Ale niestety to nie działa już. W razie wątpliwości Sprawdziłem instalację z:

sudo apt-get install python-lxml 
sudo pip install lxml 
sudo apt-get install libxml2-dev 
sudo apt-get install libxslt1-dev 

sprawdziłem, czy to może być moja wersja Pythona z:

[email protected]:~$ python 
Python 2.7.3 (default, Sep 14 2012, 14:11:57) 
[GCC 4.1.2 20061115 (prerelease) (Debian 4.1.1-21)] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import lxml 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ImportError: No module named lxml 

Mój OS Ubuntu 12.04.1 LTS z Python 2.7.3.

Wszystko wydaje się w porządku. Nie widzę, co może być problemem.

rozwiązany:

Wreszcie importowania etree z

from xml import etree 

Nie wiem dlaczego, a jeśli istnieje różnica, ale to działa zgodnie z oczekiwaniami.

+1

To jest to, do czego stworzono 'virtualenv'. –

+0

Jaki był wynik 'pip install lxml' - wygląda dziwnie, że wymagane biblioteki do skompilowania go, idą po nim ... –

+0

Co było wynikiem działania' sudo pip install lxml'? Dodatkowo, jeśli chcesz użyć 'pip' do zainstalowania' lxml', musisz zainstalować pakiet 'python-dev'. –

Odpowiedz

4

Rozwiązano problem.

Wygląda na to, że oprogramowanie, które zainstalowałem, usunęło moją ścieżkę python. Python, którego używałem podczas wywoływania Pythona w terminalu, był tym zainstalowanym przez oprogramowanie, a ten, którego wywołał mój skrypt, był tym zainstalowanym w moim systemie.

Po prostu usunąłem ścieżkę pythona oprogramowania ze zmiennej ścieżki bash.

+0

tak, wydaje mi się to również problemem dla mnie. W moim przypadku jest to sprzeczne z MAMP. "Sudo easy_install lxml" pokazuje: 'Budowanie przeciwko libxml2/libxslt w następującym katalogu:/Applications/MAMP/Library/lib .......... /tmp/easy_install-KzJaeI/lxml-3.2.5 /src/lxml/includes/etree_defs.h:9:10: błąd krytyczny: "nie znaleziono pliku" libxml/xmlversion.h ". Polecenie 'echo $ PATH' wyświetla' $ echo $ PATH /Applications/MAMP/Library/bin:/Applications/MAMP/bin/php/php5.5.26/bin:/Users/admin/.composer/vendor/bin:/opt/local/bin:/opt/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin' – r3x

6

Twoje rozwiązanie cytowane w edycji, które używa xml.etree zamiast lxml.etree nie jest lepszym rozwiązaniem, ponieważ moduł ten znał incompatibilities, a przede wszystkim dlatego, że lxml jest z pewnością bardziej optimised.

Dobrym sposobem udostępnienia czyste środowisko jest użycie virtualenv:

$ virtualenv myproject 
$ cd myproject 
$ ./bin/pip install lxml # Repeat this with other dependencies 
[wait for download and compiling] 

Następnie użyj ./bin/python wykonanie skryptu. Zaletami tej metody są:

  • można mieć różne wersje zależności pomiędzy systemem i projektu
  • nawet jeśli złamiesz wszystko w środowisku wirtualnym, nie będzie zagrożona resztę swojego systemu
  • nie trzeba uprawnień roota, aby instalację

Jako punkt odniesienia, mocniejszy, ale nieco bardziej skomplikowany sposób na osiągnięcie tego jest użycie buildout, ale wygląda na to polowanie flie s z bazooką, jeśli chcesz tylko wykonać prosty skrypt jedno-plikowy.

+0

Wiem, że wirtualne env i pip są użyteczne, ALE tak jak powiedziałem, tworzenie wirtualnego środowiska dla każdego z moich skryptów nie jest celem. Zobacz moją odpowiedź, aby zrozumieć, co było moim problemem! – user1254498

-1

Dla Pythona 3.6 jest to bardzo trudne.

Mam ten sam problem i próbuję zainstalować najnowszą wersję, lxml 3.8. Ale nadal dostaję błąd. A potem używam lxml 3.7.3, to jest w porządku.

+0

Dlaczego nie importujesz z pakietu xml, jak również wspomniano? To działa dobrze :-) –

+0

dzięki damonxu, to samo tutaj. Błąd importu Lxml 3.8, po odinstalowaniu 3.8 i zainstalowaniu 3.7.3 działa poprawnie – WoltjerD