私は非常に単純な名前空間パッケージを持っています(以下に含まれるコンテンツとディレクトリレイアウト)。インポートしようとするとnamespace_repro.module
、次のエラーが発生しますAttributeError: module 'namespace_repro' has no attribute 'module'
。私が理解している限り、私のパッケージには有効なレイアウトがあり、インポートは機能するはずです。興味深いことに、エラーはPython 3.6.8でのみ発生し、インポートはPython3.7で成功します。
私は名前のディレクトリ持っているimport-error-repro
ことにしてsetup.py
、その後(下記参照)、ネストされたディレクトリのパスをsrc/namespace_repro/module
、3つのファイルを含む、__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,
)
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
によって新しいPython3.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'
---------------------------------------------------------------------------
奇妙なことに、インポートシステムはnamespace_repro.module
2回検出されますが、3回目に失敗します。
その他の興味深い動作:
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以降、相対(循環)インポートを使用したより慣用的な形式が機能していることに注意してください。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加