неопределенный символ: __xmlStructuredErrorContext импортирует etree из lxml

>>> import lxml
>>> from lxml import etree
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: /usr/local/lib/python3.4/site-packages/lxml/etree.cpython-34m.so: undefined symbol: __xmlStructuredErrorContext

у меня есть libxml2 и libxslt, я пробовал удалять и переустанавливать тоже, это не помогло. Версия lxml: 3.4.4, python: 3.4.2, ОС: RHEL 5.5 Пожалуйста, помогите решить эту проблему

Спасибо


person Viswajith Kalavapudi    schedule 12.10.2015    source источник
comment
Дело не только в их наличии, у вас должны быть те же версии, для которых была скомпилирована разделяемая библиотека.   -  person Charles Duffy    schedule 12.10.2015
comment
Кстати, несмотря на то, что ответ, данный Регисом, не решает вашу непосредственную проблему здесь, это лучшая практика (поскольку он импортирует модуль etree напрямую, а не импортирует модуль lxml, а затем разрешает его etree ссылка).   -  person Charles Duffy    schedule 12.10.2015
comment
Кстати, вы можете найти stackoverflow.com/questions/26488797/, чтобы представлять интерес.   -  person Charles Duffy    schedule 12.10.2015


Ответы (1)


Ваша версия lxml.etree была скомпилирована с версией libxml2, отличной от той, которую вы фактически установили. Переустановка libxml2 не помогает, потому что вы просто переустанавливаете тот же код. Переустановка двоичных файлов, которые связывают ваш существующий двоичный файл etree.cpython-34m.so, также не будет работать, потому что сам этот двоичный файл по своей сути поврежден (это относится к символу, который не экспортируется во всех версиях libxml2).

Удалите модуль Python (не библиотеку C) и переустановите его из исходного кода. (pip должен уметь делать это автоматически, при условии, что у вас установлены заголовки -devel для libxml2 и libxslt и соответствующий компилятор).

person Charles Duffy    schedule 12.10.2015
comment
Спасибо, Чарльз, но я установил lxml с помощью pip. и как я могу увидеть, как была скомпилирована разделяемая библиотека? - person Viswajith Kalavapudi; 12.10.2015
comment
Вы можете использовать ldd для поиска библиотеки libxml2, используемой рассматриваемым файлом .so (убедившись, что в среде нет переменной LD_LIBRARY_PATH, когда ваш код вызывается во время выполнения с переопределением в другом месте), и nm для просмотра символов, которые он содержит. - person Charles Duffy; 12.10.2015
comment
Спасибо, Чарльз, я прошел по ссылке и сделал то же самое, и вот моя ошибка [root@qos-ucs1 lib]# nm libxml2.so.2 | grep __xmlStructuredErrorContext 00000000000a2750 T __xmlStructuredErrorContext - person Viswajith Kalavapudi; 12.10.2015
comment
и у меня есть 'T', я не уверен, что это вызывает ту же ошибку - person Viswajith Kalavapudi; 12.10.2015
comment
Итак, ваша копия libxml2 в /usr/lib действительно экспортирует этот символ, так что все должно работать нормально. Может быть, у вас есть еще один экземпляр где-то еще? Проверьте LD_LIBRARY_PATH и LD_PRELOAD в вашей среде выполнения, чтобы узнать, не вызывают ли они использование разных библиотек. - person Charles Duffy; 13.10.2015
comment
Вы также можете использовать strace, чтобы увидеть, какие файлы загружаются во время выполнения. - person Charles Duffy; 13.10.2015