2010-11-29 13 views
11

モジュールがfooの場合、Lib/site-packagesには、import fooと表示されます。しかし、卵からのものをインストールすると、blah-4.0.1-py2.7-win32.eggというようなものがフォルダ内にあり、モジュールの内容は内部にありますが、まだまだ複雑なものではありません。import foo Pythonはどのようにして卵を追跡していますか? dist-utilsを経由せずにそのフォルダをPythonインストールにドロップするのと同じようにdirnameのマッチングだけではなく、モジュールを見つけられません。Pythonはeggをインストールしたモジュールをどのように追跡していますか?

明確にする: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 
>>> 

私は空のことでモジュール "笑"(および__init__.py)で "何とか-4.0.1-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 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なしで動作するのですか?

+0

Pythonソースは完全に利用可能です。 'import'ステートメントの実装をあまり問題なく読むことができます。彼らが言うように:「源を使う、ルーク」 –

+16

@ S.Lott:質問は、「自分でやってください」という別のレベルで答えることができます。それはこのサイトの目的ではありません。これはさらに効率的です。私の代わりに、ソースを掘り下げて1時間ほど浪費させて、私は不幸にして、私はここでこれを尋ねることができます。私の答えを得る、幸せにする、他の人に代理人を与えてドーパミン放出を与える、他の誰かが知りたいと思えばこの質問をgoogleに表示させてください。 – Claudiu

+0

"時間を無駄にする"?本当に?疲れが酷いようです。あなたは多くを学ぶでしょう。さらに、この部分はかなり完成したようです。 http://docs.python.org/library/modules.html#importing-modules私はあなたがドキュメントから始まらなかったことに驚いています。 –

答えて

18

あなたは卵としてパッケージをインストールするsetuptools(またはそれのDistributeフォーク)が提供するeasy_installスクリプトを使用する場合は、デフォルトでは、それはPythonインストールのsite-packagesディレクトリにeasy-install.pthという名前のファイルを作成し、ことがわかります。 Path configuration filesは、Pythonの標準的な特徴である:パス設定ファイル名形式package.pth を有しており、上記4つの のいずれかのディレクトリに存在するファイル ある

。その の内容は、sys.pathに追加される追加項目( 行ごとに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つです。あなたはそれのためeasy-install.pthエントリが追加されていないか、それが既に存在する場合は削除され、マルチバージョンとしてディストリビューションをインストールするeasy_install-mパラメータを使用した場合)

。このため、easy_install documentationはインストールされた卵を削除する前に-mを使用するよう指示しています。

3

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

あなたの例でblah.hahaを動作させるには、easy_install blah-4.0.1-py2.7-win32.eggを実行してからimport hahaをpythonから実行するか、または単にhahaモジュールをsite-packagesに入れてください。

関連する問題