次のディレクトリ構造があるとします。
-- dir0
| file1.py
| file2.py
| dir3
| file3.py
| dir4
| file4.py
dir0 フォルダの下に file1.py と file2.py の 2 つのファイルと、dir3 と dir4 の 2 つのサブフォルダがあり、dir3 に file3.py ファイルがあり、dir4 に file4.py ファイルがあります。
1. 同レベルのモジュールをインポートする
Python はモジュールを同じレベル (同じフォルダー内の py ファイル) でインポートし、それらを直接インポートします。
import xxx
file1.py に file2.py をインポートする場合は、接尾辞「.py」を追加する必要がないことに注意してください。
import file2
# 使用file2中函数时需加上前缀"file2.",即:
# file2.fuction_name()
2. 下位モジュールをインポートする
下位ディレクトリ モジュールをインポートするのも非常に簡単です.下位ディレクトリに空の __init__.py ファイルを作成してからインポートする必要があります.
from dirname import xxx
file1.py の dir3 の下に file3.py をインポートする場合は、最初にdir3 に空の__init__.pyファイルを作成する必要があります。
-- dir0
| file1.py
| file2.py
| dir3
| __init__.py
| file3.py
| dir4
| file4.py
次に、次のステートメントを使用します。
# plan A
from dir3 import file3
または:
# plan B
import dir3.file3
# import dir3.file3 as df3
ただし、2番目の方法を使用すると、常にパスdir3で記述する必要があり、より面倒です. 別のエイリアスを使用することをお勧めします.
3. 親モジュールをインポートする
親ディレクトリの下にモジュールをインポートするには、sys.path を使用できます。
import sys
sys.path.append("..")
import xxx
たとえば、file4.py で、インポートの上位ディレクトリにある file1.py をインポートする場合:
import sys
sys.path.append("..")
import file1
sys.path の役割: import ステートメントを使用してモジュールをインポートする場合、インタープリターは現在のモジュールが配置されているディレクトリと sys.path で指定されたパスを検索して、インポートする必要があるモジュールを見つけます。 sys.path に直接上位ディレクトリを追加します。
「..」の意味: Linux の「..」に相当し、現在の作業ディレクトリの親ディレクトリを示します。実際、Python の '.' も Linux のそれと一致しており、現在のディレクトリを示しています。
4. 次のフォルダーにモジュールをインポートします。
たとえば、file4.py では、file3.py を dir3 ディレクトリにインポートします。
これは実際には前の 2 つの操作を組み合わせたもので、基本的には上位ディレクトリを sys.path に追加し、下位ディレクトリ モジュールと同じ方法でインポートするという考え方です。
引用されたフォルダー、つまり dir3 の下の空の __init__.py ファイルも必要です。
-- dir
| file1.py
| file2.py
| dir3
| __init__.py
| file3.py
| dir4
| file4.py
同時に、親ディレクトリを sys.path に追加します。
import sys
sys.path.append("..")
from dir3 import file3
5. よくある間違いとインポートの原則
親ディレクトリからモジュールを直接インポートする操作を使用する場合:
from .. import xxx
多くの場合、エラーが報告されます。
ValueError: attempted relative import beyond top-level package
これは、相対インポート中に、フォルダーが基本的にパッケージ、つまりパッケージの役割として機能するためです (たとえば、一般的に使用される numpy と pandas は両方ともパッケージです)。Python インタープリターがフォルダーがパッケージであることに同意しない場合、これは通常のフォルダーであり、相対インポートは実装できません。
パッケージとしてのフォルダーは、次の 2 つの条件を満たす必要があります。
__init__.py ファイルはフォルダーに存在する必要があり、空にすることができます。
このフォルダー内の py ファイルは、最上位モジュールとして実行できません。