我正在研究这样的简单项目:
\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
答案 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
变为环境。