Нужна помощь в установке lxml на os x 10.7 - PullRequest
5 голосов
/ 01 ноября 2011

Я изо всех сил пытался сделать from lxml import etree (кстати, import lxml работает нормально) Ошибка:

ImportError: dlopen(/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-            packages/lxml/etree.so, 2): Symbol not found: _htmlParseChunk
Referenced from: /Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/lxml/etree.so
Expected in: flat namespace
in /Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/lxml/etree.so

Я использовал pip для установки lxml и homebrew для переустановки libxml2 с правильной архитектурой (или я так думаю) ... у кого-нибудь есть идеи, как это исправить / диагностировать? Я на 64-битном питоне

1 Ответ

12 голосов
/ 01 ноября 2011

lxml немного возмущен тем, какие сторонние библиотеки он использует, и ему часто нужны более новые версии, чем те, которые поставляются Apple. Предлагаем вам прочитать и следовать инструкциям здесь для сборки lxml из исходного кода на Mac OS X, включая создание собственных статически связанных библиотек. Это должно работать. (Я немного удивлен, что у домашнего пивовара еще нет рецепта lxml.)

ОБНОВЛЕНИЕ: Исходя из ограниченной информации в ваших комментариях, трудно быть уверенным, что именно происходит. Я подозреваю, что вы не используете ту версию Python, о которой думаете. Есть много способов успешно установить lxml; это часть проблемы: слишком много вариантов. Вместо того, чтобы пытаться отлаживать ваши настройки, вот, пожалуй, самый простой способ получить работающий lxml на 10.7 с помощью системы Python 2.7, поставляемой Apple.

$ sudo STATIC_DEPS=true /usr/bin/easy_install-2.7 lxml

После этого вы сможете использовать lxml.etree следующим образом:

$ /usr/bin/python2.7
Python 2.7.1 (r271:86832, Jun 16 2011, 16:59:05) 
[GCC 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2335.15.00)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> from lxml import etree
>>> etree.__file__
'/Library/Python/2.7/site-packages/lxml-2.3.1-py2.7-macosx-10.7-intel.egg/lxml/etree.so'
>>> 

Я заметил, что процесс статической сборки lxml не создает работающую универсальную сборку. Вероятно, вы увидите такие сообщения во время установки lxml:

ld: warning: ignoring file /private/tmp/easy_install-83mJsV/lxml-2.3.1/build/tmp/libxml2/lib/libxslt.a, file was built for archive which is not the architecture being linked (i386)

Предполагается, что архитектура по умолчанию на вашем компьютере - 64-битная, если вы пытаетесь работать в 32-битном режиме:

$ arch -i386 /usr/bin/python2.7
Python 2.7.1 (r271:86832, Jun 16 2011, 16:59:06) 
[GCC 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2335.15.00)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> from lxml import etree
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: dlopen(/Library/Python/2.7/site-packages/lxml-2.3.1-py2.7-macosx-10.7-intel.egg/lxml/etree.so, 2): Symbol not found: _htmlParseChunk
  Referenced from: /Library/Python/2.7/site-packages/lxml-2.3.1-py2.7-macosx-10.7-intel.egg/lxml/etree.so
  Expected in: flat namespace
 in /Library/Python/2.7/site-packages/lxml-2.3.1-py2.7-macosx-10.7-intel.egg/lxml/etree.so
>>> ^D

И есть сообщение об ошибке, о котором вы изначально сообщили! Таким образом, основная причина этого заключается в том, что статические библиотеки (libxml2 и т. Д.), Которые строит lxml, не являются универсальными. Пока вам не нужно использовать lxml в 32-битном процессе (это маловероятно для большинства применений), это не должно быть проблемой. Скорее всего, Python, который вы изначально использовали, был 32-битным; это согласуется с некоторыми другими сообщениями, о которых вы сообщили.

...