12

私がモジュールを持っている場合、、fooLib/site-packages、私はちょうどできimport foo、それは動作します。ただし、eggsからコンテンツをインストールするblah-4.0.1-py2.7-win32.eggと、モジュールの内容が内部にあるフォルダーのようなものが得られますが、それでも必要なのはimport foo、それ以上の複雑なことではありません。Pythonはどのように卵を追跡しますか?dist-utilsを経由せずにそのフォルダーをPythonインストールにドロップするかのように、dirnameが一致するだけでなく、モジュールが見つかりません。

明確にするために:私はちょうどzopeをインストールしました。フォルダ名は「zope.interface-3.3.0-py2.7-win32.egg」です。これは機能します:

Python 2.7.1 (r271:86832, Nov 27 2010, 18:30:46) [MSC v.1500 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import zope.interface
>>>

空のモジュール「haha」(および)を含む「blah-4.0.1-py2.7-win32.egg」フォルダーを作成します__init__.py。これは動作しません:

Python 2.7.1 (r271:86832, Nov 27 2010, 18:30:46) [MSC v.1500 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import blah.haha
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: No module named blah.haha
>>>

ただし、これは次のようになります。

Python 2.7.1 (r271:86832, Nov 27 2010, 18:30:46) [MSC v.1500 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> from pkg_resources import require
>>> require("blah>=1.0")
[blah 4.0.1 (c:\python27\lib\site-packages\blah-4.0.1-py2.7-win32.egg)]
>>> import haha
>>>

では、どうすればそれをなしで機能させることができrequireますか?

4

2 に答える 2

19

easy_installによって提供されるスクリプトsetuptools(またはそのフォーク)を使用してDistributeパッケージをeggとしてインストールすると、デフォルトで、Pythonインストール easy-install.pthのディレクトリに名前が付けられたファイルが作成されることがわかります。パス構成ファイルはPythonの標準機能です。site-packages

パス構成ファイルは、名前がpackage.pthの形式であり、上記の4つのディレクトリのいずれかに存在するファイルです。その内容は、sys.pathに追加される追加の項目(1行に1つ)です。

easy_installこのPython機能を多用します。easy_installディストリビューションの追加または更新に使用するeasy-install.pthと、eggディレクトリまたはzipファイルを追加するように変更されます。このようにeasy_installして、モジュールの検索順序の制御を維持し、モジュールがインストールする卵が検索順序の早い段階で表示されるようにします。easy-install.pth:の内容の例を次に示します。

import sys; sys.__plen = len(sys.path)
./appscript-0.21.1-py2.6-macosx-10.5-ppc.egg
./yolk-0.4.1-py2.6.egg
./Elixir-0.7.1-py2.6.egg
./Fabric-0.9.0-py2.6.egg
import sys; new=sys.path[sys.__plen:]; del sys.path[sys.__plen:]; p=getattr(sys,'__egginse
rt',0); sys.path[p:p]=new; sys.__egginsert = p+len(new)

ここでわかるように、のコードを調べると、setuptoolsそれ自体をブートストラップし、そのトラックをカバーするためにいくつかのトリックが必要であることがわかります。これにより、デバッグの問題site.pyやインタプリタの起動が少し面白くなる可能性があります。(これが、一部の開発者がそれを使用するのが好きでない理由の1つです。)

-mのパラメータを使用してディストリビューションをマルチバージョンeasy_installとしてインストールする場合、そのエントリは追加されないか、すでに存在する場合は削除されます。これが、インストールされているeggを削除する前に使用するようにドキュメントに記載されている理由です。easy-install.ptheasy_install-m

于 2010-11-29T18:53:18.503 に答える
3

easy_installを実行すると、eggがsite-packagesにコピーされ、そのeggへのパスがsys.path変数に配置されます。(sys.pathはPATH環境変数ではなく、PYTHONPATHおよびその他の環境変数から構築されることに注意してください。したがって、easy_installでインストールする.eggファイルは環境変数に入れられ、Pythonはそれをsys.pathに追加することを認識します。 Pythonインタープリターが起動します)。

blah.hahaを例で機能させるには、実行easy_install blah-4.0.1-py2.7-win32.eggしてimport hahaからpython内から実行するか、hahaモジュールをサイトパッケージに直接配置します。

于 2010-11-29T16:52:59.510 に答える