53

私はこのようなプロジェクト構造を持っています...

/some_app
    build/
    README
    out.py
    some_app/
        __init__.py
        mod1.py
        mod2.py

今度は、トリックをいじることなく、some_appパッケージをにインポートしたいと思います。私がしたのは...mod2sys.path

# mod2.py
import some_app

コマンドラインからmod2.pyを実行すると

some_app $ python mod2.py

エラーをスローしますImportError: No module named some_app

しかし、out.pyファイル内では、

# out.py
import some_app.mod2

そしてします

some_app $ python out.py

それは完璧に動作します。

したがって、起こっているのはこれです。同じパッケージ内にあるモジュールにパッケージをロードしてから、そのモジュールを__main__ファイルとして実行しますが、機能しません。次に、同じモジュール(私が__main__実行したモジュール)を別のモジュール内にロードしてから、その別のモジュールを__main__-として実行すると、動作します。

誰かがここで何が起こっているのか詳しく説明してもらえますか?

アップデート

some_appパッケージ内のモジュールを直接インポートできた可能性があるため、これを行う直接的な理由はないことを理解しています。私がこれを試している理由は、Djangoプロジェクトでは、これが彼らが行っていることだからです。たとえば、このファイルを参照してください

すべてのモジュールで、すべての非標準インポートは。で始まりdjango.ます。だから私は彼らがなぜそしてどのようにそれをしているのか疑問に思いました。

更新2

関連リンク

4

3 に答える 3

49

mod2.pyの一部ですsome_app。そのため、モジュールはすでに内部にあるため、モジュールをインポートしても意味がありません。

あなたはまだすることができますimport mod1。私はあなたがsome_app/__init__.py走る必要があると思います。それが可能かどうかはわかりません。


編集:

あなたが求めていることをするように見えfrom . import some_moduleます。

于 2012-05-18T06:57:50.247 に答える
2

パッケージと同じディレクトリにあり、Pythonインタープリターがそのパスからモジュールの検索を開始するため、からimport some_app.mod2実行できます。out.pysome_app

フォルダにパッケージmod2.pyがないため、のインポートエラーは正常です。some_appmod2.py

于 2012-05-18T06:53:42.060 に答える
-7

「from.importsome_module」はPython3でのみ機能するようです。

普遍的な方法は、init.pyですべてのインポートを行うことです

于 2018-03-09T19:54:00.137 に答える