2017-11-30 7 views
5

私は書いたPythonスクリプトをパッケージ化して遊んでいます。サブモジュールがありますので、submoduleとしましょう。フォルダ構造は次のようになります。Pythonはインストールされていないモジュールをインポートできます

cool_script/ 
    setup.py 
    cool_script.py 
    submodule/ 
    __init__.py 
    implementation.py 

今、多くのpip install .pip install -e .コールの後、私はsubmoduleをグローバルにインポートすることができる状況があります。私のシステムで、これは常に動作しますどんなに:

$ python3 
[...] 
>>> import submodule 
>>> submodule.__file__ 
'/home/me/fake/path/cool_script/submodule/__init__.py' 

しかし、私は理由を知りません。

私が作成したパッケージはもう一度アンインストールされましたが、pipはそのサブモジュールをインデックスに見つけることができませんでした。何も、私は手動でまだそこに座ったcool_script.egg-linkを削除し、いずれかのdist-のパッケージではありません:

$ ls /usr/local/lib/python3.4/dist-packages | ack cool 
$ ls /usr/local/lib/python3.4/dist-packages | ack submodule 
$ 

PYTHONPATHすることだけでなく、空である:

$ echo $PYTHONPATH 

$ 

なぜPythonはsubmoduleの場所を知っています?どうすればわかりますか?

+0

virtualenvにインストールされましたか?それはLinuxシステムですか? –

+0

これは確かにLinuxシステムです。いいえ、私は地球環境でこれらの実験を行いました。私はそれが非常にばかだと分かっています。レッスンは学んだと思います。 – iFreilicht

+0

これはダムに聞こえるかもしれませんが、リブートを試みましたか?たぶんどこかにキャッシュされているかもしれません – RunOrVeith

答えて

3

最初に実行したのはpython -c "import site; print(site.getsitepackages())"です。

['/XXX/something/site-packages'] 

は通常、このリスト内の単一のパスがあり、そしてそれはpipは、スクリプトをインストールしたディレクトリを指す:それはこのようなリストを出力します。あなたが好奇心があればlsに入れることができます:ls /XXX/something/site-packages/

もっと興味深いことに、pipは、開発者インストール(a.k.a. 012.)を使用しているときに、そのディレクトリに「リンク」ファイルを置きます。 「リンク」ファイルの名前は、元のプロジェクトの名前の末尾に.egg-linkという拡張子が付きます。

おそらくそのディレクトリにcool_script.egg-linkというファイルがあります。そして、もしあなたがそれを印刷しようとすると、あなたのモジュールの元のファイルシステムの場所がその内容に含まれているはずです。 ? - :

$ cat /XXX/something/site-packages/cool_script.egg-link 
/home/me/fake/path/cool_script/ 
. 

これはpipは、それが開発者モードで何かをインストールしたことを記録し、それはPythonは実際に右、それはあまりにも簡単だったでしょう(あなたのモジュールを検索する方法を知っているかいないかである:ような何か))。

Pythonはおよそ.egg-linkファイルは知りませんが、それはsys.path(*)のために追加のパスを取得するにはsite-packagesディレクトリ内のすべての.pthのファイルを読み込みます。したがって、Pythonが開発者モードのインストールをインポートできるようにするためには、pipは、easy-installツールがその技術を実際に先駆けしていたため、easy-install.pthと呼ばれる単一の.pthファイルにすべてのパスを書き込みます。あなたは、そのファイルをプリントアウトなら、あなたは開発者モードでインストールすべてプロジェクトパスのリストを取得します:

$ cat /XXX/something/site-packages/easy-install.pth 
/home/me/fake/path/cool_script/ 
/home/me/another/project/ 

をそして、あなたは本当にeasy-install.pthに記載されているすべてのこれらのパスが実際にあなたのsys.pathに追加されますことを確認することができます。

(*)技術的には、.pthファイルを読むPythonの部分は、通常は起動時に自動的にインポートされるsiteモジュールです。例えば、python -Sを使用して、siteモジュールを無効にするオプションがあります。その場合、にはsite-packagesディレクトリも開発者インストールパスも含まれていないことがわかります。

+0

これは、フォルダが 'easy-install.pth'にリストされていることです。それを削除すると問題が解決しました!徹底的な説明をありがとう。 – iFreilicht

関連する問題