2017-08-29 8 views
-1

私はこのように見て単純なプロジェクトに取り組んでいる:私はsetup.py developを実行すると、私のvenv、import abcd.history作品に対して、'setup.py develop'が '__init__.py'なしでディレクトリをインポートできるのはなぜですか?

\setup.py 
\abcd 
\abcd\__init__.py 
\abcd\history\docs.py 

。私はsetup.py installを実行すると、私のvenvに対して、import abcd.historyは例外私を返します。

ImportError: No module named 'abcd.history' 

なぜ? Pythonのバージョンは3.5.1から

答えて

-1

ですdocs:__init__.pyファイルはPythonがパッケージを含むようにディレクトリを扱うために必要されている

。これは、文字列などの共通名を持つディレクトリが、後でモジュール検索パス上で発生する有効なモジュールを意図せず隠すのを防ぐために行われます。

setup.py developはちょうどあなたが環境に実際にinstallそれにしようとすると失敗するabcd.historyのインポートが可能になりますローカルディレクトリにあなたのインタプリタを指しているという事実についての何かがあるに違いありません。

0
$ ls -R1 
sub 
test-sub.py 

./sub: 
__init__.py 
module 

./sub/module: 
testxxx.py 

$ cat test-sub.py 
#! /usr/bin/env python 
import sub.module 

$ python3.5 test-sub.py 
$ python3.4 test-sub.py 
$ python2.7 test-sub.py 
Traceback (most recent call last): 
    File "test-sub.py", line 3, in <module> 
    import sub.module 
ImportError: No module named module 

再開:Pythonの3 __init__.pyずにサブモジュールをインポートすることができ(のみモジュールのトップレベルディレクトリは__init__.pyを必要とする)、パイソン2ができません。 Python 2がどこに忍び込んでいたのかを調べてみてください。

2

setup.py developは、あなたの開発ディレクトリにsort of a pseudo-symlinkというパッケージをインストールします。\abcd\history\のようなものがそこに表示されます。 import abcd.historyは、そのフォルダをimplicit namespace packageというPython 3.3で導入された機能としてインポートします。暗黙の名前空間パッケージは__init__.pyを必要としません。

setup.py install擬似シンボリックリンクは作成されません。それはインストールするように設定されているものだけをインストールし、明らかにabcd.historyをインストールするように設定されていませんでした。

+0

'setup.py install'は実際に' abcd \ history'ディレクトリをvenvにコピーしません。 venv内のエッグファイルには、 '\ abcd \ __ init __。py'のみが含まれています。 – user723893

関連する問題