2012-10-22 29 views
61

Lưu ý: Tôi đang sử dụng virtualenvwrapper.Tại sao tôi không thể lấy `pip install lxml` để làm việc trong virtualenv?

Trước khi kích hoạt các môi trường ảo:

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

Sau khi kích hoạt các môi trường ảo:

(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 
+1

Tôi bằng cách nào đó không thấy cách nào đây là một câu hỏi lập trình cụ thể. IMHO, điều này thuộc về http: //www.serverfault.com –

+4

@MarkusWMahlberg Virtualenv là một tiện ích Python rất phổ biến được sử dụng chủ yếu bởi các lập trình viên trong quá trình phát triển, không phải bởi sysadmins trong quá trình triển khai. lxml rất phổ biến và loại vấn đề này không phải là hiếm. Tôi coi đây là chủ đề theo tiêu chí "các công cụ phần mềm thường được các lập trình viên sử dụng". –

+0

@JeremyBanks Tôi biết rõ về virtualenv. Nhưng tôi nghĩ rằng chúng tôi có một vấn đề khá liên quan đến môi trường và cơ hội để có được một câu trả lời hữu ích nên được nhiều higer trên serverfault. –

Trả lời

110

Bạn có thể đã đã lxml được cài đặt trên hệ thống của bạn, có lẽ được cài đặt do một gói hệ thống. Do đó, lần thử đầu tiên (pip install lxml không có virtualenv hoạt động) không thành công, nhưng nó cũng không cài đặt; nó thực sự không làm gì cả.

Trong virtualenv, theo mặc định, các gói hệ thống bị bỏ qua. Do đó, pip nghĩ rằng lxml không được cài đặt. Vì vậy, nó cố gắng để cài đặt nó vào môi trường ảo của bạn.

lxml chứa các mô-đun C cần được biên dịch để cài đặt đúng cách. Tuy nhiên, việc biên dịch các mô-đun C này dựa vào việc bạn có một số "thư viện phát triển" đã được cài đặt. Các thư viện phát triển này là các thư viện C, không phải Python, và như vậy pip sẽ không thể tự động lấy chúng từ internet và cài đặt chúng cho bạn.

Do đó, bạn sẽ cần phải tự mình cài đặt các thư viện phát triển này, rất có thể bằng cách sử dụng trình quản lý gói của bạn. Trong một hệ thống Debian (như Ubuntu), đây là ...

apt-get install libxml2-dev libxslt-dev 

này sẽ cài đặt các thư viện libxml2 và phát triển libxslt vào hệ thống địa phương của bạn. Nếu bạn thử cài đặt lại lxml, bước biên dịch mô-đun C sẽ hoạt động vì bây giờ các thư viện phát triển này nằm trong hệ thống của bạn.

Thông báo lỗi bạn nhận được là do các thư viện này bị thiếu (phần libxml/xmlversion.h: No such file or directory một phần của thông báo lỗi).

Xem thêm: How to install lxml on Ubuntu

+1

'Đã cài đặt thành công lxml' Cảm ơn bạn! Tôi tò mò nếu bạn biết về một nơi mà bản đồ các tiêu đề cần thiết để gói Python (phổ biến) khác nhau. Tôi cũng có vấn đề với người khác. Ngoài ra, apt-get python-dev chỉ nhận tiêu đề cho thư viện chuẩn không? –

+3

Đặt cược tốt nhất: tìm kiếm google cho tệp tiêu đề bị thiếu, hy vọng người khác đang gặp sự cố tương tự. Ngoài ra, có, python-dev chỉ được bạn tiêu đề cho thư viện chuẩn. libxml2-dev không liên quan gì đến python: libxml2 là thư viện C mà bạn vừa mới sử dụng thư viện python để làm việc. Đó là lý do tại sao nó không được cài đặt khi bạn cài đặt python-dev. Nếu không, về cơ bản bạn cần phải cài đặt mọi thư viện C tồn tại trên thế giới để đảm bảo bạn có tất cả các tiêu đề mà bạn cần để làm cho mọi thư viện python (chẳng hạn như lxml) hoạt động mà không cần thêm các bước –

+0

. nhiều! – EvertW

18

cho người dùng centos: khi nhận được:

error: command 'gcc' failed with exit status 1

DO:

sudo yum install libxslt-devel libxml2-devel 
5

Nếu bạn có lxml cài đặt ở cấp hệ thống, và muốn để di chuyển nó vào một số virtualenv mà bạn không tạo với --system-site-packages, bạn có thể liên kết nó vào thư mục virtualenv 'dist-packages'.

Bên ngoài virtualenv của bạn, trong một vỏ python:

import lxml 
print lxml.__file__ 

Trong trường hợp của tôi, nó được tìm thấy trong /usr/lib/python2.7/dist-packages. Sẽ có một thư mục lxml và tệp thông tin trứng. Bất cứ nơi nào virtualenv của bạn, đi vào thư mục /lib/python-x.y/dist-packages (bạn có thể cần phải tạo dist-packages) và liên kết tượng trưng cả thư mục thư viện và trứng vào thư mục đó.

Các vấn đề liên quan