gpt4 book ai didi

python - 如何解决 Python 3.6 中的此导入错误?

转载 作者:行者123 更新时间:2023-12-04 21:29:43 26 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





Imports in __init__.py and 'import as' statement

(4 个回答)


1年前关闭。




我有一个 very simple 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.pyy.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,
)
src/namespace_repro/module/__init__.py :
from namespace_repro.module.x import x
src/namespace_repro/module/x.py :
import namespace_repro.module.y as y

x = y.y

最后 src/namespace_repro/module/y.py :
y = True

我创建了一个全新的 Python 3.6 conda 环境 conda create -n namespace6 python=3.6 ipython ,然后我激活它并将软件包安装为 pip install -e ./import-error-repro (请注意, -e 无关紧要,没有它问题是可重现的)。之后,我尝试了 import namespace_repro.moduleipython (尽管在官方 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'
---------------------------------------------------------------------------

奇怪的是导入系统发现 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

目录布局
. import-error-repro
+-- setup.py
+-- src
| +-- namespace_repro
| | +-- module
| | | +-- __init__.py
| | | +-- x.py
| | | +-- y.py

最佳答案

这是 CPython 错误 30024 ,不出所料,这在 3.7 中得到了修复。请注意,自 3.5 以来,具有相对(圆形)导入的更惯用形式已起作用。

关于python - 如何解决 Python 3.6 中的此导入错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56394350/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com