2

小さな python プロジェクトが 2 つのサブディレクトリを持つメイン ディレクトリに分割されている場合:

src/
    run.py
    subdir1/
            __init__.py
            module1.py
            subdir2/
                    __init__.py
                    module2.py

module2 を module1 に含めるには、完全なインクルード パスfrom subdir1.subdir2.module2 import Class2(実行中の python ファイルに関連するパス) を使用する必要がありますfrom subdir2.module2 import Class2か? (ステートメントが入っているファイルに相対的)

src/
    run.py
    subdir1/
            __init__.py
            module1.py
    subdir2/
            __init__.py
            module2.py

module1にmodule2を含めるのが最善の方法です。プログラムが実行されている場所に対して相対的に試しましたfrom subdir2.module2 import Class2が、これはエラー"No module named module2"を与えますとにかくこれが物事を行うための最も移植性の高い方法ではないと考えずにはいられません。特に最初の例では、ステートメントが存在するファイルへの相対パス。

別の Active Directory からコードを呼び出しても、混乱しないと思いますか?python dir/run.py

ありがとう!

4

1 に答える 1

3

モジュールをインポートするには、次の 2 つの方法があります。

  1. 絶対輸入
  2. 相対インポート

絶対インポートにより、python は、sys.path 現在のモジュールに相対するモジュールへの相対インポート アドレスに格納されているディレクトリ内の目的のモジュールを検索します。Python パッケージ内でのみ相対インポートを使用できます。

subdir1最初のケースはパッケージであるため、相対インポートを使用できます

subdir12 つ目は、 andsubdir2がパッケージに含まれていないため、相対インポートを使用できません。

pep-8によると:

インポート システムが正しく構成されていない場合 (パッケージ内のディレクトリが sys.path になる場合など) は、通常はより読みやすく、より適切に動作する (または少なくともより適切なエラー メッセージが表示される) 傾向があるため、絶対インポートをお勧めします。

import mypkg.sibling
from mypkg import sibling
from mypkg.sibling import example

ただし、明示的な相対インポートは、特に絶対インポートを使用すると不必要に冗長になるような複雑なパッケージ レイアウトを扱う場合に、絶対インポートの代わりに使用できます。

from . import sibling
from .sibling import example

標準ライブラリ コードは、複雑なパッケージ レイアウトを避け、常に絶対インポートを使用する必要があります。

暗黙的な相対インポートは決して使用すべきではなく、Python 3 で削除されました。

于 2013-11-05T11:16:44.400 に答える