Python 2.6.6 では、祖父母と同じ名前のモジュールがあります。私のプロジェクト構造 (Flask を使用する Web アプリ) は、おおよそ次のようになります。
panel/
run.py
panel/
__init__.py
database.py
views/
__init__.py
root.py
dash.py
panel.py
users/
__init__.py
models.py
run.py の横にあるパッケージ名はpanelであることに注意してください。panel.views.panelという名前のモジュールもあります。panel/__init__.py 内から、次の 3 つのスタイルのいずれかを使用して panel.views.panel をインポートする場合:
from panel.views import panel
from panel.views import panel as panel_view
import panel.views.panel as panel_view
panel.pyをインポートした後、他のインポートが機能しません。たとえば、 panel.users.models が database.py をインポートしようとすると、次のトレースバックがスローされます。
Traceback (most recent call last):
File "run.py", line 5, in <module>
from panel import app
File "/opt/www/panel/panel/__init__.py", line 8, in <module>
from panel.views import root
File "/opt/www/panel/panel/views/root.py", line 9, in <module>
from panel import database;
ImportError: cannot import name database
私は #pocoo IRC チャンネルで何人かの人々と話をしました。彼らの説明によると、問題は、views/root.py 内から、隣にあるpanel.pyからimport panel.database
インポートすることをPython が考えていることです。database
PEP 328はこの正確な問題を概説し (どのように読むか)、これを修正するために絶対インポートをデフォルトにしたため、これは私には意味がありません。私は Python 2.6.6 を使用しているので、これがデフォルトのはずです。念のため、行を追加しましたfrom __future__ import absolute_import
が、違いはありませんでした。database.py のインポートで同じエラーが発生しました。
panel.py の名前を変更するとこの問題は解決しますが、なぜこれが書かれているとおりに機能しないのか、特にこれを機能させるためにできることがあれば、非常に興味があります。