kor*_*tyi 5 python python-import python-3.x namespace-package
我有一个非常简单的名称空间包(内容包括在下面,以及目录布局)。如果尝试导入namespace_repro.module,则会出现以下错误:AttributeError: module 'namespace_repro' has no attribute 'module'。据我了解,我的程序包具有有效的布局,导入应该可以进行。有趣的是,该错误仅在Python 3.6.8中存在,并且导入在Python 3.7中成功。
我有一个新的目录import-error-repro,在它setup.py(见下文),然后一个嵌套的目录路径src/namespace_repro/module,包含三个文件__init__.py,x.py和y.py。它们的内容:
setup.py
from setuptools import find_namespace_packages, setup
setup(
name='namespace-repro',
version='0.1.0',
python_requires='>=3.6',
packages=find_namespace_packages('src'),
package_dir={'': 'src'},
zip_safe=False,
)
Run Code Online (Sandbox Code Playgroud)
src/namespace_repro/module/__init__.py:
from namespace_repro.module.x import x
Run Code Online (Sandbox Code Playgroud)
src/namespace_repro/module/x.py:
import namespace_repro.module.y as y
x = y.y
Run Code Online (Sandbox Code Playgroud)
最后src/namespace_repro/module/y.py:
y = True
Run Code Online (Sandbox Code Playgroud)
我通过创建了一个全新的Python 3.6 conda环境conda create -n namespace6 python=3.6 ipython,然后将其激活并安装了软件包pip install -e ./import-error-repro(请注意,-e没关系,没有它,该问题是可以重现的)。在那之后,我试图 import namespace_repro.module在ipython(虽然在官方Python解释器同样的情况)。结果是
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-1-bcae5a697dad> in <module>
----> 1 import namespace_repro.module
~/namespace-repro/src/namespace_repro/module/__init__.py in <module>
----> 1 from namespace_repro.module.x import x
~/namespace-repro/src/namespace_repro/module/x.py in <module>
----> 1 import namespace_repro.module.y as y
2
3 x = y.y
AttributeError: module 'namespace_repro' has no attribute 'module'
---------------------------------------------------------------------------
Run Code Online (Sandbox Code Playgroud)
奇怪的是,导入系统发现namespace_repro.module两次,但第三次失败!
其他一些有趣的行为:
In [1]: import namespace_repro.module.y as y # This doesn't work.
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-4-4035347ea59b> in <module>
----> 1 import namespace_repro.module.y as y
AttributeError: module 'namespace_repro' has no attribute 'module'
In [2]: import namespace_repro.module.y # But this one does! Why?
In [3]: dir(namespace_repro.module.y) # The error returns when we actually want to use the module.
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-3-d89bcfd9e509> in <module>
----> 1 dir(namespace_repro.module.y)
AttributeError: module 'namespace_repro' has no attribute 'module'
In [4]: from namespace_repro.module.y import y # This works fine!
In [5]: y
Out[5]: True
Run Code Online (Sandbox Code Playgroud)
. import-error-repro
+-- setup.py
+-- src
| +-- namespace_repro
| | +-- module
| | | +-- __init__.py
| | | +-- x.py
| | | +-- y.py
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
150 次 |
| 最近记录: |