1

Easy_Install -2.7 . 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 で使用すると、ファイルの 1 つを除いてすべてが失われます。"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)

HEREは、正確なステートメント仕様です。

動的にロード可能な共有ライブラリとして実装されたモジュールをロードして初期化し、そのモジュール オブジェクトを返します。モジュールがすでに初期化されている場合は、再度初期化されます。再初期化には、モジュールのキャッシュされたインスタンスの属性を、 sys.modules__dict__ にキャッシュされたモジュールで使用されている値にコピーすることが含まれます。pathname 引数は、共有ライブラリを指している必要があります。name 引数は、初期化関数の名前を作成するために使用されます。共有ライブラリでinitname()と呼ばれる外部 C 関数が呼び出されます。オプションのファイル引数は無視されます。(注意: 共有ライブラリの使用はシステムに大きく依存しており、すべてのシステムがサポートしているわけではありません。)

そこで、 lxml のlibxml2libxsltの両方への依存関係を明確に述べているlxml Web サイトを読み始めました。静的にリンクされていない限り、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 インタープリターをインストールする簡単な方法。/usr/lib/python2.7 という正しい場所にインストールし、Cygwin がそれを見つけて使用できることを確認しない限り、Cygwin のネイティブ機能の一部が失われます。これはまた、Cygwin (UTF-8) とは異なるファイル許可、大文字と小文字の区別、および文字セット (UTF-16LE) を使用するため、将来的に他の多くの問題が発生する可能性があります。難易度:簡単

  2. Cygwin の Python のハッキングを続けて、(1) で使用したバイナリ ライブラリで動作するようにします。ただし、これには次のものが必要です。

    • a) 裸の Python インタープリターを除く、すべての Cygwin 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)の方が賢明な方法だと思いますが、テストしていないため、これを良い答えとは考えていません。ところで。もう 1 つの癖として、インタプリタを次のように実行する必要があります。リターンを押したときに " SyntaxError: 無効な構文python.exe -E"という煩わしさを避けるために!

結論:

どうやら、lxml を使用するために libxml2 および libxslt python パッケージは必要ありません! 私の場合、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 に答える