为什么'setup.py develop'允许导入没有'__init__.py'的目录?

时间:2017-08-29 13:13:48

标签: python setuptools

我正在研究这样的简单项目:

\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

3 个答案:

答案 0 :(得分: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

答案 1 :(得分: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则不能。{2}试着找出Python 2已经悄然发生的地方,并使你的装置瘫痪。

答案 2 :(得分:-1)

来自docs

  

需要__init__.py文件才能使Python将目录视为包含包;这样做是为了防止具有通用名称的目录(例如字符串)无意中隐藏稍后在模块搜索路径上出现的有效模块。

必须有一些事实,即setup.py develop只是将您的解释器指向允许导入abcd.history的本地目录,当您尝试将其install变为环境。