2017-08-29 69 views
-1

我的工作簡單的項目看起來像這樣:爲什麼'setup.py develop'允許導入沒有'__init__.py'的目錄?

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

當我運行setup.py develop,對我VENV,import abcd.history作品。當我運行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只是點你解釋到本地目錄允許的abcd.history導入失敗當您嘗試實際上install它變成一個環境。

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),Python 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

相關問題