ImportError: Отказано в доступе при использовании LXML

У меня возникла масса проблем с использованием LXML после его установки с https://pypi.python.org/pypi/lxml/3.2.1 с помощью Easy_Install-2.7. Я установил его в Windows с помощью cygwin, и сначала с пакетом все было в порядке. Однако при дальнейшем тестировании я столкнулся с проблемами.

Когда я запускаю код с помощью:

import lxml

он работает совершенно нормально. Но как только я пытаюсь:

import lxml.etree

Я получаю эту ошибку:

Traceback (most recent call last):
  File "D:\Nick_Code\NewsScraper\testdummy.py", line 7, in <module>
    import lxml.etree
  File "/usr/lib/python2.7/site-packages/lxml-3.2.0-py2.7-cygwin-1.7.20-i686.egg/lxml/etree.py", line 7, in <module>
    __bootstrap__()
  File "/usr/lib/python2.7/site-packages/lxml-3.2.0-py2.7-cygwin-1.7.20-i686.egg/lxml/etree.py", line 6, in __bootstrap__
    imp.load_dynamic(__name__,__file__)
ImportError: Permission denied

Я пытался найти информацию/обходные пути в течение некоторого времени, но безуспешно. Пожалуйста, дайте мне знать, если у вас есть какие-либо идеи или нужна информация.

Спасибо!

Майкл


person user2480810    schedule 13.06.2013    source источник
comment
Похоже, вам не хватает двоичных файлов... Попробуйте посмотреть [здесь][1] [1]: stackoverflow.com/questions/9453986/   -  person Alex Kreimer    schedule 13.06.2013
comment
Одним из простых решений с этой страницы является загрузка неофициальных двоичных файлов Windows: lfd. uci.edu/~gohlke/pythonlibs/#lxml, который я пробовал и потерпел неудачу точно так же. Бинарные файлы теперь доступны и на официальном сайте lxml.   -  person user2480810    schedule 14.06.2013
comment
Я не уверен в этом, но вы можете попробовать добавить расположение двоичных файлов в переменную PATH и посмотреть, поможет ли это.   -  person Alex Kreimer    schedule 14.06.2013


Ответы (1)


Это не основательный ответ. Но я выделю несколько проблем, связанных с поиском решения. Скорее всего, описанная выше проблема подобна раку, вызванному несколькими факторами, действующими одновременно катастрофически.

У меня точно такая же проблема, как и в OP, при попытке использовать собственные пакеты Python, поставляемые Cygwin, на моем компьютере с Windows Vista. Будучи новичком в Python, я потратил несколько дней, пытаясь заставить это работать, и понял, почему это не работает. Но все мои гугл-фу ничего не дали, кроме бесчисленных тупиков. Итак, вот мой взгляд на это.

Есть много причин, по которым у Python могут возникнуть проблемы с Cygwin, с некоторыми из которых вы можете что-то сделать, а некоторые не поддаются контролю большинства людей. К чему это сводится, так это к следующим ключевым вопросам:

  1. Windows — это полный беспорядок, когда дело доходит до прав доступа к файлам, а Cygwin не очень хорошо справляется с правами доступа к файлам Windows. Итак, то, что вы видите в Cygwin, далеко не вся история.

  2. Windows позорно не зависит от регистра символов, что вызывает массу проблем, особенно когда вам нужно (кросс) скомпилировать что-либо, что изначально было разработано в системе на основе * nix (то есть все). На самом деле, если вы попытаетесь извлечь любой архив, содержащий файлы, имена которых отличаются только заглавными буквами. (т. е. «makefile» или «Makefile» и т. д.) под Windows или Cygwin, вы потеряете все файлы, кроме одного. в случае, если вам нужно включить чувствительность к регистру, чтобы делать что-то большее, чем компиляции «hello world» * nix.

  3. Windows обрабатывает символические ссылки совершенно иначе, чем Cygwin. И если ваши ZIP, TAR и т.п. архивы содержат символические ссылки, они будут повреждены после распаковки в среду Windows.

  4. Неаккуратная практика кода, когда разработчик не тестировал должным образом свои творения в различных средах или тщательно не устанавливал правильные права доступа к файлам для своих *.tar.gz коллекций. Включение правильных спецификаций зависимостей или упоминание о том, были ли бинарные файлы статически связаны и т. д.

Для получения полной информации и дальнейших (Win-Cygwin) проблем см. noreferrer">ЗДЕСЬ.

Сначала я пытался использовать собственный Python от Cygwin без каких-либо дополнительных пакетов и устанавливать lxml с помощью PIP и easy_install. Затем я попытался использовать собственные пакеты Cygwin libxml2, libxslt и xml python, и у меня были те же проблемы.

Сначала, после установки статических двоичных файлов Windows (как было предложено в другом месте), я получил эту ошибку:

File "/usr/lib/python2.7/site-packages/lxml-3.2.4-py2.7-cygwin-1.7.24-i686.egg/lxml/etree.py", line 6, in __bootstrap__
    imp.load_dynamic(__name__,__file__)
ImportError: Permission denied
Aborted (core dumped)

Затем я проверил права доступа к файлам и изменил их на: chmod -R 755 /usr/lib/python2.7/

Я сделал еще один шаг, чтобы изолировать проблему от явно отсутствующего файла. И включение подробного и диагностического режима тоже не сильно помогло.

File "/usr/lib/python2.7/site-packages/lxml-3.2.4-py2.7-cygwin-1.7.24-i686.egg/lxml/etree.py", line 6, in __bootstrap__
    imp.load_dynamic(__name__,__file__)
ImportError: No such file or directory
Aborted (core dumped)

ЗДЕСЬ — точная спецификация инструкции:

Загрузите и инициализируйте модуль, реализованный как динамически загружаемая разделяемая библиотека, и верните его объект модуля. Если модуль уже был инициализирован, он будет инициализирован снова. Повторная инициализация включает копирование атрибута __dict__ кэшированного экземпляра модуля вместо значения, используемого в модуле, кэшированном в sys.modules. Аргумент pathname должен указывать на разделяемую библиотеку. Аргумент name используется для построения имени функции инициализации: вызывается внешняя функция C, называемая initname() в разделяемой библиотеке. Необязательный аргумент файла игнорируется. (Примечание: использование разделяемых библиотек сильно зависит от системы, и не все системы его поддерживают.)

Поэтому я начал читать веб-сайт lxml, где четко указаны зависимости lxml от обоих libxml2 и libxslt, и если они не связаны статически, они также зависят от iconv и zlib. Итак, вы пришли к выводу, что вам нужно установить все это. Не надо! Продолжить чтение. Но если вы собираетесь собирать из исходников (что может попытаться сделать easy_install), вам понадобится все, включая библиотеки заголовков для разработки: libxml2-devel, libxslt-devel. В другом месте говорится, что вам также нужен Cython и установка с помощью:

easy_install lxml==dev 

Зависимости показаны на этом рисунке из ЗДЕСЬ:

зависимости libxml

Итак, вы думаете, что вам может сойти с рук что-то вроде:

STATIC_DEPS=true pip install lxml

Но это тоже не работает. Вероятно, потому что библиотеки, используемые для компиляции Cygwin Python, должны быть такими же, как и для компиляции lxml. Но я не знаю. Обратите внимание, что пакет lxml ссылается на Cygwin "1.7.24". Мой Cygwin уже "1.7.25", и вы можете проверить это с помощью uname -a. Затем вы можете проверить свой статический исполняемый файл Python с помощью file и ldd. Тогда вы понимаете, что это также зависит от C-компилятора, используемого для сборки python/cygwin под Windows или *nix. Почувствовав запах кошмара, я решил, что строить свой собственный — не лучший путь. Затем я попытался установить библиотеки Python (поставляемые в виде исполняемых файлов), предназначенные для Windows Python. Это не сработало, так как у меня никогда не устанавливался собственный Python для Windows, и меня встретила ошибка, что установленный Python не может найти Python в моем реестре. Я мог бы, конечно, просто извлечь исполняемый файл, но я бы не знал, куда положить двоичные файлы без установщика. Так что у меня появилась другая идея...

Насколько я вижу, есть 3 возможных решения, чтобы заставить это работать.

  1. Простой способ установки собственного интерпретатора Python для Windows. Вы потеряете некоторые собственные функции Cygwin, если не установите их в нужное место: /usr/lib/python2.7 и не убедитесь, что Cygwin может их найти и использовать. Это также использует другие права доступа к файлам, чувствительность к регистру и набор символов (UTF-16LE), чем Cygwin (UTF-8), что потенциально может создать много других проблем в будущем! Сложность: простая

  2. Продолжайте взламывать Cygwin's Python, чтобы заставить его работать с бинарными библиотеками, используемыми в (1). Но для этого требуется:

    • a) Uninstall and remove all Cygwin Python packages, except bare Python interpreter.
    • б) Удалите все PIP и следы простой установки.
    • c) Взлом реестра Windows, чтобы притвориться, что у вас установлен Python27:
    • HKEY_LOCAL_MACHINE\ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ\Python\PythonCore\2.7\InstallPath C:\Python27\
    • HKEY_LOCAL_MACHINE\SOFTWARE\Python\PythonCore\2.7\PythonPath C:\Python27\Lib;C:\Python27\DLLs;C:\Python27\Lib\lib-tk
    • HKEY_CLASSES_ROOT...
    • г) Установите бинарные библиотеки Windows.
    • e) Надеюсь, все остальное теперь должно работать с PIP или easy_install. Сложность: средняя!
  3. Делать это правильно, компилируя Python и все библиотеки с нуля. Сложность: Тяжело!

Я успешно сделал (1), но я все еще думаю, что (2) - это более разумный способ сделать это, но я не проверял его, поэтому я не считаю это хорошим ответом. КСТАТИ. Еще одна причуда: мне приходится запускать интерпретатор с помощью: python.exe -E, чтобы избежать раздражающего: "SyntaxError: недопустимый синтаксис" при нажатии клавиши возврата!

Вывод:

По-видимому, вам не нужны пакеты Python libxml2 и libxslt для использования lxml! В моем случае мне понадобился Scrapy, поэтому мне также пришлось установить несколько других пакетов.

$ pip.exe list
cssselect (0.9.1)
lxml (3.2.4)
pip (1.4.1)
pyOpenSSL (0.11)
pywin32 (218)
queuelib (1.1.1)
Scrapy (0.20.0)
setuptools (1.4.1)
six (1.4.1)
Twisted (13.2.0)
w3lib (1.5)
zope.interface (4.0.5)


$ll /cygdrive/c/Python27/Lib/site-packages/
adodbapi
cssselect
isapi
lxml
OpenSSL
pip
pythonwin
pywin32_system32
queuelib
scrapy
twisted
w3lib
win32
win32com
win32comext
zope
cssselect-0.9.1-py2.7.egg-info
lxml-3.2.4-py2.7.egg-info
pip-1.4.1-py2.7.egg-info
queuelib-1.1.1-py2.7.egg-info
Scrapy-0.20.0-py2.7.egg-info
six-1.4.1-py2.7.egg-info
Twisted-13.2.0-py2.7.egg-info
w3lib-1.5-py2.7.egg-info
zope.interface-4.0.5-py2.7.egg-info
PyWin32.chm
setuptools-1.4.1-py2.7.egg
pyOpenSSL-0.11-py2.7.egg-info
pywin32-218-py2.7.egg-info
easy-install.pth
pywin32.pth
setuptools.pth
zope.interface-4.0.5-py2.7-nspkg.pth
pythoncom.py
six.py
pythoncom.pyc
six.pyc
pythoncom.pyo
pywin32.version.txt
README.txt

Полезные ссылки:

person not2qubit    schedule 26.11.2013