這不是一個可靠的答案。但是我會重點介紹幾個獲得解決方案的問題。上述問題很可能就像一個由幾個因素一起發生災難性致癌的癌症。
當我嘗試在我的Windows Vista機器上使用本機Cygwin提供的Python包時,我的問題與OP中的問題完全相同。作爲Python的新手,我花了好幾天的時間試圖讓它發揮作用,並理解它爲什麼不起作用。但是,我所有的Google-fu都只能返回無數的死衚衕。所以這是我的承諾。
有很多原因可以解釋爲什麼Python在Cygwin下可能會遇到麻煩,有些可以做些什麼以及超出大多數人的控制範圍。沸騰什麼下來,有以下關鍵問題:
Windows是一個完整的混亂,當涉及到文件權限,和Cygwin不能處理Windows文件的權限非常好。所以你在Cygwin看到的遠不是全部。
Windows是可恥的字符大小寫無關,這會導致大量麻煩,特別是當您需要(交叉)編譯最初在基於* nix的系統(即所有內容)下開發的任何東西時。事實上,如果您嘗試提取包含名稱僅在大寫字母上存在差異的文件的任何存檔。 (即在Windows或Cygwin下的文件(即「makefile」vs「Makefile」等)文件,你只會釋放其中一個文件。在他們的情況下你需要啓用區分大小寫而不是「hello world」* nix編譯。
Windows處理與Cygwin完全不同的符號鏈接。如果你的ZIP,TAR等檔案包含任何符號鏈接,它們將在提取到Windows環境之後被破壞。
懶惰的代碼實踐,開發人員沒有在各種環境下正確測試他們的創作,或仔細設置適當的文件權限,以他們的*.tar.gz
集合。包括正確的依賴性規範,或者提及二進制文件是否被靜態鏈接等。
對於全血淋淋的細節和進一步的(贏 - 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是確切的說法規格:
Load and initialize a module implemented as a dynamically loadable shared library and return its module object. If the module was already initialized, it will be initialized again. Re-initialization involves copying the __dict__
attribute of the cached instance of the module over the value used in the module cached in sys.modules. The pathname argument must point to the shared library. The name argument is used to construct the name of the initialization function: an external C function called initname() in the shared library is called. The optional file argument is ignored. (Note: using shared libraries is highly system dependent, and not all systems support it.)
所以我就開始閱讀這顯然狀態LXML的兩個的libxml2和的libxslt依賴性,除非它們是靜態鏈接lxml website,他們也依賴於iconv和zlib。所以你會導致相信你需要安裝所有這些。別!繼續閱讀。但是,如果您要從源代碼構建(因爲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編譯器。嗅到噩夢我決定建立我自己的是不是要走的路。接下來我嘗試安裝適用於Windows Python的Python庫(提供爲 可執行文件)。這是行不通的,因爲我從來沒有安裝Windows本地Python,並且我遇到了一個安裝程序在我的註冊表中找不到Python的錯誤。我當然可以提取可執行文件,但我不知道在沒有安裝程序的情況下將二進制文件放在哪裏。所以我有另一個想法... ...
有3種可能的解決方案來獲得這個工作,據我所見。
安裝Windows本地Python解釋器的簡單方法。除非你安裝在正確的地方:/usr/lib/python2.7,並確保Cygwin可以找到並使用Cygwin的功能。這也會使用與Cygwin(UTF-8)不同的文件權限,區分大小寫和字符集(UTF-16LE),這可能會導致許多其他問題! 難度:容易
繼續黑客Cygwin的Python,使其與(1)中使用的二進制庫一起工作。但是這需要:
- a)卸載並刪除所有Cygwin Python軟件包,但裸露的Python解釋器除外。
- b)移除所有畫中畫和簡易安裝痕跡。
- C)黑客Windows註冊表假裝安裝Python27:
- HKEY_LOCAL_MACHINE \ SOFTWARE \ Python的\ PythonCore \ 2.7 \安裝路徑C:\ Python27 \
- HKEY_LOCAL_MACHINE \ SOFTWARE \ Python的\ PythonCore \ 2.7 \ PYTHONPATHÇ :\ Python27 \ Lib; C:\ Python27 \ DLLs; C:\ Python27 \ Lib \ lib -tk
- HKEY_CLASSES_ROOT ...
- d)安裝Windows二進制庫。 e)其他所有的應該現在可以用PIP或easy_install。 難度:中等!
通過從頭開始編譯Python和所有庫來做到這一點。 難度:難!
我成功地做了(1),但我仍然認爲(2)是這樣做的更聰明的方式,但我沒有測試它,這就是爲什麼我不認爲這是一個很好的答案。 BTW。還有一個怪癖,我必須運行解釋器:python.exe -E
以避免討厭:「SyntaxError:無效的語法」當擊中返回!
結論:
顯然,你並不需要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
有用的參考:
它看起來像你缺少的二進制文件... 嘗試尋找[這裏] [1] [1]:http://stackoverflow.com/questions/9453986/easy-install-lxml-on-python-2-7-on- windows –
該頁面的簡單解決方案之一是下載非官方的Windows二進制文件:http://www.lfd.uci.edu/~gohlke/pythonlibs/#lxml我嘗試過並且以完全相同的方式失敗。二進制文件現在也在官方的lxml站點上。 – user2480810
我不確定這個,但你可以嘗試添加二進制文件的位置到PATH變量,看看它是否有幫助 –