2013-06-13 27 views
1

使用Easy_Install-2.7從https://pypi.python.org/pypi/lxml/3.2.1安裝後,我一直在使用LXML時遇到了很多麻煩。我使用cygwin將它安裝在Windows上,起初該軟件包似乎沒問題。然而,經過進一步測試,我遇到了問題。ImportError:使用LXML時的權限被拒絕

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 

我一直試圖找到相當長一段時間,但沒有成功信息/變通。請讓我知道,如果你有任何見解或需要的信息。

謝謝!

Michael

+0

它看起來像你缺少的二進制文件... 嘗試尋找[這裏] [1] [1]:http://stackoverflow.com/questions/9453986/easy-install-lxml-on-python-2-7-on- windows –

+0

該頁面的簡單解決方案之一是下載非官方的Windows二進制文件:http://www.lfd.uci.edu/~gohlke/pythonlibs/#lxml我嘗試過並且以完全相同的方式失敗。二進制文件現在也在官方的lxml站點上。 – user2480810

+0

我不確定這個,但你可以嘗試添加二進制文件的位置到PATH變量,看看它是否有幫助 –

回答

3

這不是一個可靠的答案。但是我會重點介紹幾個獲得解決方案的問題。上述問題很可能就像一個由幾個因素一起發生災難性致癌的癌症。

當我嘗試在我的Windows Vista機器上使用本機Cygwin提供的Python包時,我的問題與OP中的問題完全相同。作爲Python的新手,我花了好幾天的時間試圖讓它發揮作用,並理解它爲什麼不起作用。但是,我所有的Google-fu都只能返回無數的死衚衕。所以這是我的承諾。

有很多原因可以解釋爲什麼Python在Cygwin下可能會遇到麻煩,有些可以做些什麼以及超出大多數人的控制範圍。沸騰什麼下來,有以下關鍵問題:

  1. Windows是一個完整的混亂,當涉及到文件權限,和Cygwin不能處理Windows文件的權限非常好。所以你在Cygwin看到的遠不是全部。

  2. Windows是可恥的字符大小寫無關,這會導致大量麻煩,特別是當您需要(交叉)編譯最初在基於* nix的系統(即所有內容)下開發的任何東西時。事實上,如果您嘗試提取包含名稱僅在大寫字母上存在差異的文件的任何存檔。 (即在Windows或Cygwin下的文件(即「makefile」vs「Makefile」等)文件,你只會釋放其中一個文件。在他們的情況下你需要啓用區分大小寫而不是「hello world」* nix編譯。

  3. Windows處理與Cygwin完全不同的符號鏈接。如果你的ZIP,TAR等檔案包含任何符號鏈接,它們將在提取到Windows環境之後被破壞。

  4. 懶惰的代碼實踐,開發人員沒有在各種環境下正確測試他們的創作,或仔細設置適當的文件權限,以他們的*.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

libxml dependecies

所以,你認爲你可能喜歡的東西逃脫:

STATIC_DEPS=true pip install lxml 

但是,這也沒有做到這一點。可能是因爲用於編譯Cygwin Python的庫必須與用於編譯lxml的庫相同。但我不知道。請注意lxml包是如何引用Cygwin 「1.7.24」。我的Cygwin已經是「1.7.25」,你可以用uname -a來檢查。然後你可以用fileldd來檢查你的靜態python可執行文件。然後你明白這也取決於在Windows或* nix下用於構建python/cygwin的C編譯器。嗅到噩夢我決定建立我自己的是不是要走的路。接下來我嘗試安裝適用於Windows Python的Python庫(提供爲 可執行文件)。這是行不通的,因爲我從來沒有安裝Windows本地Python,並且我遇到了一個安裝程序在我的註冊表中找不到Python的錯誤。我當然可以提取可執行文件,但我不知道在沒有安裝程序的情況下將二進制文件放在哪裏。所以我有另一個想法... ...

有3種可能的解決方案來獲得這個工作,據我所見。

  1. 安裝Windows本地Python解釋器的簡單方法。除非你安裝在正確的地方:/usr/lib/python2.7,並確保Cygwin可以找到並使用Cygwin的功能。這也會使用與Cygwin(UTF-8)不同的文件權限,區分大小寫和字符集(UTF-16LE),這可能會導致許多其他問題! 難度:容易

  2. 繼續黑客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。 難度:中等!
  3. 通過從頭開始編譯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 

有用的參考: