1

在使用 Easy_Install-2.7从https://pypi.python.org/pypi/lxml/3.2.1安装 LXML 之后,我在使用 LXML 时遇到了很多麻烦。我使用 cygwin 在 Windows 上安装了它,起初这个包似乎还可以。然而,经过进一步的测试,我遇到了问题。

当我运行代码时:

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

很长一段时间以来,我一直在尝试寻找信息/解决方法,但没有成功。如果您有任何见解或需要信息,请告诉我。

谢谢!

迈克尔

4

1 回答 1

4

这不是一个可靠的答案。但我将强调获得解决方案所涉及的几个问题。很可能上述问题就像是由多种因素共同作用导致的癌症。

当我尝试在我的 Windows Vista 机器上使用本机 Cygwin 提供的 Python 包时,我遇到了与 OP 中相同的问题。作为 Python 的新手,我花了几天时间试图让它工作,并理解它为什么不工作。但我所有的 Google-fu 都返回了无数死胡同。所以这是我对此的看法。

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)问题,请查看此处

起初我尝试使用 Cygwin 自己的 Python 而不使用任何额外的包,并使用 PIP 和 easy_install 安装 lxml。然后我尝试使用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)

是确切的声明规范:

加载并初始化实现为动态可加载共享库的模块并返回其模块对象。如果模块已经初始化,它将再次初始化。重新初始化涉及将模块缓存实例的属性复制到缓存在sys.modules__dict__ 中的模块中使用的值。pathname 参数必须指向共享库。name 参数用于构造初始化函数的名称:调用共享库中名为initname()的外部 C 函数。可选的文件参数被忽略。(注意:使用共享库高度依赖系统,并非所有系统都支持。)

所以我开始在lxml 网站上阅读,其中清楚地说明了 lxml 对libxml2libxslt的依赖关系,除非它们是静态链接的,否则它们还依赖于 iconv 和 zlib。所以你被引导相信你需要安装所有这些。不!继续阅读。但是,如果您要从源代码构建(easy_install 可能会尝试这样做),您将需要一切,包括开发头库:libxml2-devel、libxslt-devel。另一个地方指出您还需要Cython并安装:

easy_install lxml==dev 

依赖关系显示在这张来自HERE的图片中:

libxml 依赖项

所以你认为你可能会逃脱类似的事情:

STATIC_DEPS=true pip install lxml

但这也不行。可能是因为用于编译 Cygwin 的 Python 的库必须与用于编译 lxml 的库相同。但我不知道。注意 lxml 包是如何引用 Cygwin "1.7.24"的。我的 Cygwin 已经是“1.7.25”,您可以使用uname -a. 然后你可以检查你的静态python可执行文件fileldd. 然后你就会明白这也取决于用于在 Windows 或 *nix 下构建 python/cygwin 的 C 编译器。闻到噩梦的味道,我决定自己建造不是要走的路。所以接下来我尝试安装适用于 Windows Python 的 Python 库(作为可执行文件提供)。这不起作用,因为我从未安装过 Windows 本机 Python,并且收到一个错误,即安装程序无法在我的注册表中找到 Python。我当然可以只提取可执行文件,但如果没有安装程序,我不知道将二进制文件放在哪里。于是我有了另一个想法……

据我所知,有 3 种可能的解决方案可以让它发挥作用。

  1. 安装 Windows 本机 Python 解释器的简单方法。你失去了一些原生的 Cygwin 功能,除非你安装在正确的位置:/usr/lib/python2.7 并确保 Cygwin 可以找到并使用它。这也使用了与 Cygwin (UTF-8) 不同的文件权限、区分大小写和字符集 (UTF-16LE),可能会产生许多其他问题!难度:简单

  2. 继续破解 Cygwin 的 Python,使其与 (1) 中使用的二进制库一起工作。但这需要:

    • a) 卸载并删除所有 Cygwin Python 包,除了裸 Python 解释器。
    • b) 删除所有 PIP 和易于安装的痕迹。
    • c) 入侵 Windows 注册表以假装安装了 Python27:
    • HKEY_LOCAL_MACHINE\SOFTWARE\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...
    • d) 安装 Windows 二进制库。
    • e) 所有其余的现在应该希望可以与 PIP 或 easy_install 一起使用。难度:中等!
  3. 通过从头开始编译 Python 和所有库来正确执行此操作。难度:难!

我成功地做到了(1),但我仍然认为(2)是更聪明的做法,但我没有测试过,这就是为什么我不认为这是一个好的答案。顺便提一句。还有一个怪癖,我必须使用以下命令运行解释器:python.exe -E以避免在返回时出现烦人的:“ SyntaxError: invalid syntax ”!

结论:

显然,您不需要 libxml2 和 libxslt python 包来使用 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

有用的参考资料:

于 2013-11-26T02:46:34.053 回答