私はこのようなファイル構造を持っています:
Folder
Common
foo1.py
TestFolder
foo2.py
foo2.py
およびにインポートしたいfoo1.py
。試しましたが、Ubuntuでは動作しません:
sys.path.append(os.path.abspath('../../'))
from Common import foo1.py
私はこのようなファイル構造を持っています:
Folder
Common
foo1.py
TestFolder
foo2.py
foo2.py
およびにインポートしたいfoo1.py
。試しましたが、Ubuntuでは動作しません:
sys.path.append(os.path.abspath('../../'))
from Common import foo1.py
回答:
Pythonがモジュールを見つける方法
厳密に言えば、モジュールは単一のpythonファイルであり、パッケージは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
パッケージを作成し、パッケージからモジュールをインポートする場合$PYTHONPATH
、モジュールを含むフォルダーを作成する必要があります。このフォルダーには、(空の場合もある)というファイルが付属します__init__.py
例えば:
my_package
in と呼ばれるパッケージ(フォルダー)からインポートするには、例1のようににパスを/home/myname/pythonfiles
追加し、(パッケージフォルダー内の)と呼ばれるモジュールをインポートします。/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
printenv PYTHONPATH
ないのですか?
sys.path.append("/path/to/your/package_or_module")
また、デフォルトへのパスが追加され、混乱が少なくなります。これと比較して、最初の引数としてsys.path.insert(0,...)
持っ0
ています。
相対インポートを使用する正しい方法は次のとおりです。
from ..Common import foo1
また__init__.py
、すべてのフォルダーにが必要です。
注意:この回答は、Python 3の最新バージョンでは時代遅れですが、以前のバージョンではここにあります。詳細については、コメントとhttps://www.python.org/dev/peps/pep-0420/をご覧ください。
基本的に、syspathに追加するPythonコードを含むすべてのフォルダーには、__ init__.pyファイルが必要です。これらの__init__.pyファイルは空にすることができます。
python -c "from pathlib import Path; Path('ns').mkdir(); Path('ns/mod.py').write_text('''print('mod.py')'''); import ns.mod; from shutil import rmtree; rmtree('ns')"
また、ここではいくつかの関連文書、だ名前空間のパッケージのセマンティクスを添加することを記載してPEP 420は、
__init__.py
あなたのフォルダ内のファイルを?これは、pythonがパッケージを作成し、そのパッケージからモジュールをインポートできるようにする方法です。guide.python-distribute.org/creation.html