这不是一个可靠的答案。但我将强调获得解决方案所涉及的几个问题。很可能上述问题就像是由多种因素共同作用导致的癌症。
在我的 Windows Vista 机器上尝试使用本机 Cygwin 提供的 Python 包时,我遇到了与 OP 中相同的问题。作为 Python 的新手,我花了几天时间试图让它工作,并理解它为什么不工作。但我所有的 Google-fu 都返回了无数死胡同。所以这是我的看法。
Python 在 Cygwin 下出现问题的原因有很多,有些是你可以做的,有些是大多数人无法控制的。归结为以下关键问题:
Windows 在文件权限方面完全是一团糟,Cygwin 不能很好地处理 Windows 文件权限。所以你在 Cygwin 中看到的远非全部。
Windows 可耻地与字符大小写无关,这会导致很多麻烦,尤其是当您需要(交叉)编译最初在基于 *nix 的系统下开发的任何内容(即所有内容)时。事实上,如果您尝试提取包含名称仅大小写不同的文件的任何存档。 (即“makefile”与“Makefile”等)Windows 或 Cygwin 下的文件,除了其中一个文件外,您会丢失所有文件。万一他们需要启用区分大小写来执行“hello world”*nix 编译以外的任何操作。
Windows 处理符号链接的方式与 Cygwin 完全不同。如果您的 ZIP、TAR 等档案包含任何符号链接,它们将在提取到 Windows 环境后被破坏。
草率的代码实践,开发人员没有在各种环境中正确测试他们的创作,或者没有为他们的*.tar.gz 集合仔细设置适当的文件权限。包括正确的依赖规范,或提及二进制文件是否已静态链接等。
有关完整的血腥细节和更多 (Win-Cygwin) 问题,请查看 HERE。
一开始我尝试使用 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)
HERE 是准确的语句规范:
加载并初始化实现为动态可加载共享的模块
库并返回其模块对象。如果模块已经初始化,它
将再次初始化。重新初始化涉及复制__dict__
模块缓存实例的属性超过模块中使用的值
缓存在 sys.modules 中。 pathname 参数必须指向共享库。
name 参数用于构造初始化函数的名称:
调用共享库中名为 initname() 的外部 C 函数。这
可选文件参数被忽略。 (注意:使用共享库是高度
取决于系统,并非所有系统都支持它。)
所以我开始阅读lxml website,它清楚地说明了 lxml 对 libxml2 和 libxslt 的依赖关系,除非它们是静态链接的,否则它们还依赖于 iconv 和兹库。所以你被引导相信你需要安装所有这些。不!继续阅读。但是,如果您要从源代码构建(easy_install 可能会尝试这样做),您将需要一切,包括开发头库:libxml2-devel、libxslt-devel。另一个地方说您还需要 Cython 并安装:
easy_install lxml==dev
依赖关系如图来自HERE:
所以你认为你可能会逃脱这样的事情:
STATIC_DEPS=true pip install lxml
但这也不行。可能是因为用于编译 Cygwin 的 Python 的库必须与用于编译 lxml 的库相同。但我不知道。注意 lxml 包是如何引用 Cygwin "1.7.24" 的。我的 Cygwin 已经是 "1.7.25",您可以通过 uname -a 进行检查。然后您可以使用file 和ldd 检查您的静态python 可执行文件。然后你就会明白这也取决于用于在 Windows 或 *nix 下构建 python/cygwin 的 C 编译器。闻到噩梦的味道,我决定自己建造不是要走的路。所以接下来我尝试安装 Python 库(提供为
可执行文件)适用于 Windows Python。这不起作用,因为我从未安装过 Windows 本机 Python,并且收到一个错误,即安装程序无法在我的注册表中找到 Python。我当然可以只提取可执行文件,但如果没有安装程序,我不知道将二进制文件放在哪里。于是我有了另一个想法……
据我所知,有 3 种可能的解决方案可以让它发挥作用。
安装 Windows 本机 Python 解释器的简单方法。你失去了一些原生的 Cygwin 功能,除非你安装在正确的位置:/usr/lib/python2.7 并确保 Cygwin 可以找到并使用它。这也使用了与 Cygwin (UTF-8) 不同的文件权限、区分大小写和字符集 (UTF-16LE),可能会产生许多其他问题! 难度:简单
-
继续破解 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 一起使用。 难度:中等!
通过从头开始编译 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
有用的参考资料: