私はこのようなファイル構造を持っています:
Folder
Common
foo1.py
TestFolder
foo2.py
foo2.py
およびfoo1.py
でインポートしたい。試しましたが、Ubuntuでは動作しません:
sys.path.append(os.path.abspath('../../'))
from Common import foo1.py
pythonがモジュールを見つける方法
厳密に言えば、moduleは単一のpythonファイルですが、packageは、pythonファイルを含むフォルダーであり、__init__.py
という名前の(空の場合もある)ファイルを伴い、pythonがモジュールのインポート元のパッケージであることを伝えます。どちらの場合も、モジュールには.py
拡張が必要ですが、それらのインポートはなしで行われます(以下を参照)。
デフォルトでは、Pythonは$PYTHONPATH
でモジュールとパッケージを探します。
$ PYTHONPATHに含まれるものを調べるには、python(3)で次のコードを実行します。
import sys
print(sys.path)
ディレクトリの追加方法
ときどき
pythonファイル内から、pythonアプリケーションまたはスクリプトのheadセクションに次の行を追加することにより、デフォルトのパスに時々パスを追加できます。
import sys
sys.path.insert(0, "/path/to/your/package_or_module")
例:
フォルダがある場合:/home/myname/pythonfiles
、そのディレクトリにあるファイルmodule_1.py
をインポートしたい場合、これをコードのヘッドセクションに追加します。
import sys
sys.path.insert(0, "/home/myname/pythonfiles")
そして、次の方法でファイルmodule_1.py
を簡単にインポートできます。
import module_1
packageを作成し、パッケージからモジュールをインポートする場合、モジュールを含むフォルダーを$PYTHONPATH
に作成する必要があります。 __init__.py
という(空の場合もある)ファイル
例:
my_package
の/home/myname/pythonfiles
というパッケージ(フォルダー)からインポートするには、例1のように/home/myname/pythonfiles
パスを$PYTHONPATH
に追加し、次のようにmodule_2.py
(パッケージフォルダー内)というモジュールをインポートします。
from <packagename> import module_2
ディレクトリを$PYTHONPATH
に永続的に追加する:
~/.profile
ファイルに次の行を追加します。
export PYTHONPATH=$PYTHONPATH:/path/you/want/to/add
サブディレクトリ
パッケージ内からは、サブディレクトリはそのようには含まれません。ディレクトリを「チェーン」する必要があります。モジュールmodule_3.py
をインポートするには、フォルダーsubfolder
フォルダーpackagename
内に:
import packagename.subfolder.module_3
パッケージ内のすべてのサブフォルダーに独自の__init__.py
ファイルが含まれているという事実を考えます。
モジュールがスクリプトまたはアプリケーションと同じディレクトリにある場合
モジュールがスクリプトまたはアプリケーションと同じディレクトリにある場合、モジュールへのパスを挿入する必要はありません。モジュールは自動的に追加されます。
例:
script.py
とmodule.py
を含むフォルダーがある場合、次の方法でモジュールをインポートできます。
import module
相対インポートを使用する正しい方法は次のとおりです。
from ..Common import foo1
また、すべてのフォルダーに__init__.py
も必要です。
NB:この回答はpython 3の最新バージョンでは時代遅れですが、以前のバージョンではここにあります。詳細については、コメントと https://www.python.org/dev/peps/pep-0420/ を読んでください。
基本的にsyspathに追加するpythonコードを含むすべてのフォルダーには、__ init__.pyファイルが必要です。これらの__init__.pyファイルは空にすることができます。