2

私はPythonでアプリケーションを開発するのに忙しいです.私のアプリケーションは次のように構成されています.

main.py
pr/
    core/
        __init__.py
        predictor.py
    gui/
        predictor/
            __init__.py
            predict_panel.py
        __init__.py
        pr_app.py
    __init__.py

を使用してアプリケーションを起動しますmain.py

pr_app.py私が持っている内部

class PrApp(wx.App):
    PREDICTOR = Predictor()

内部でpredict_panel.py私はうまくやることができます

from pr.core.predictor import Predictor

しかし、何らかの理由で私はできません

from pr.gui.pr_app import PrApp

私は提示されます

ImportError: cannot import name PrApp

Python で親ディレクトリからインポートする際に何か落とし穴がありますか、それとも何か不足していますか?

4

3 に答える 3

2

私はこれを試し、あなたのようなツリーを作成しました__init__.pyが、prディレクトリにを追加しました。それがなければ失敗__init__.pyするfrom pr.core.predictor import Predictorはずなので、持っていると思いますが、質問に書くのを忘れてしまいました。

私はあなたがした失敗を得ることができませんでした、それは私にとってうまくいきました。予想どおり、から両方のインポートを実行できますpredict_panel.py

ただし、インポート元の場合、からのインポートpr_app.pyは失敗します。これは、循環インポートがあるためです。のインポート中にからインポートしようとし、のインポート中にインポートしようとします。これにより、インポートが無限に繰り返されるため、許可されません。predict_panelpredict_panel.pyPrApppredict_panelPrAppPrAppPrApppredict_panel

これを解決する最善の方法は、コードを再編成して、循環インポートを実行する必要がないようにすることです。PrApp輸入する場合predict_panel、なぜpredict_panel必要なのPrAppですか?これは、欠陥のある設計の兆候です。

ただし、これを修正する最も簡単な方法は、インポートの1つをモジュールの先頭から呼び出される関数/メソッドに移動することです。これは悪い習慣ですが、問題はすぐに解決します。

于 2012-12-11T09:45:08.463 に答える
0

main.py を使用してアプリケーションを起動します

そうすることで、フォルダーを正しくpr/パッケージにすることができるので、そのパッケージ内の相互参照インポートが機能するはずです。したがって、両方ともpr.gui.pr_app import PrApp機能from ..pr_app import PrAppするはずです。

あなたの場合の問題はpr、実際のパッケージを作成していないことだと思います。そこにもa を追加してみてください__init__.py。うまくいくはずです。

于 2012-12-11T09:37:14.647 に答える
-1

親ディレクトリからインポートできない理由は、各スクリプトが自身をインポート ツリーの最上位と見なしているためです。それが見る唯一の他のものはsys.path. したがって、私が知る限り、上記からインポートする唯一の方法は、親ディレクトリをパスに追加することです (絶対相対ではありません)。

これをファイルの先頭に置きます。

import sys
import os
import inspect

#enable imports from dir above
sys.path.append(os.path.abspath(
    os.path.dirname(inspect.getfile(inspect.currentframe()))+"/.."))
于 2012-12-11T09:23:11.203 に答える