4

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 の名前を変更するとこの問題は解決しますが、なぜこれが書かれているとおりに機能しないのか、特にこれを機能させるためにできることがあれば、非常に興味があります。

4

1 に答える 1

2

行を追加したfrom __future__ import absolute_importと言いましたが、どのファイルに追加したかは言いませんでした。必ず root.py に追加してください。

Pythonチュートリアルのこのセクションでは、あなたのケースで何が起こっているかを説明しています: http://docs.python.org/tutorial/modules.html#intra-package-references

于 2012-09-18T23:47:21.347 に答える