Pythonモジュールをsyspathに追加する方法は?


69

私はこのようなファイル構造を持っています:

Folder
   Common
      foo1.py
   TestFolder
      foo2.py

foo2.py およびにインポートしたいfoo1.py。試しましたが、Ubuntuでは動作しません:

sys.path.append(os.path.abspath('../../'))
from Common import foo1.py

あなたが持っていますか__init__.pyあなたのフォルダ内のファイルを?これは、pythonがパッケージを作成し、そのパッケージからモジュールをインポートできるようにする方法です。guide.python-distribute.org/creation.html
ブライアン

私は共通してとTestFolderでinit.pyファイル持っている
user284474

インポートする場合は、サブフォルダーと同様にフォルダーディレクトリでも必要です
ブライアン

このinit .pyは空ですか?
user284474

1
ええ、空でも構いません。パッケージに特定の構成が必要な場合
Bryan

回答:


115

Pythonがモジュールを見つける方法

厳密に言えば、モジュールは単一のpythonファイルであり、パッケージはpythonファイルを含むフォルダーであり、(空にすることもできます)という名前のファイルを伴い、__init__.pypythonにモジュールをインポートするパッケージであることを伝えます。どちらの場合も、モジュールには.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_packagein と呼ばれるパッケージ(フォルダー)からインポートするには、例1のようににパスを/home/myname/pythonfiles追加し、(パッケージフォルダー内の)と呼ばれるモジュールをインポートします。/home/myname/pythonfiles$PYTHONPATHmodule_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.pymodule.py:、私は単純にして、モジュールをインポートすることができます

import module

また、python.org / dev / peps / pep-0328を読むことをお勧めします。特にPython 3をターゲットにしている場合(または将来ターゲットを設定する場合)
-zaadeh

なぜprintenv PYTHONPATHないのですか?
スティービーG

1
sys.path.append("/path/to/your/package_or_module")また、デフォルトへのパスが追加され、混乱が少なくなります。これと比較して、最初の引数としてsys.path.insert(0,...)持っ0ています。
ポールルージュ

1
@PaulRougieux:パスへの追加の問題は、モジュールがパスの他の場所(たとえば.eggファイル内)に既に存在している可能性があり、ファイル内のモジュールではなく、そのバージョンのモジュールを選択することです。
スナーク

6

相対インポートを使用する正しい方法は次のとおりです。

from ..Common import foo1

また__init__.py、すべてのフォルダーにが必要です。


1
どうも。しかし、2つのフォルダであるモジュールがある場合、どのようにインポートしますか?....からフォルダが動作していない
user284474

単一のレベルで機能しますか?
シルヴァンピノー

単一レベルで機能します。
user284474

わかりました、この答えを受け入れてもらえますか?マルチレベルのために、あなたは別の質問をするが、最初にこれを見てとることができても、質問とその答えはパッケージ内にあなたのモジュールを呼び出すための最良の方法のために
シルヴァンピノー

これはPython 2またはPython 3に当てはまりますか?または両方?
アレックス

2

注意:この回答は、Python 3の最新バージョンでは時代遅れですが、以前のバージョンではここにあります。詳細については、コメントとhttps://www.python.org/dev/peps/pep-0420/をご覧ください。


基本的に、syspathに追加するPythonコードを含むすべてのフォルダーには、__ init__.pyファイルが必要です。これらの__init__.pyファイルは空にすることができます。


私が理解しているように、これはもはや事実ではなく、ディレクトリは「名前空間」になりました。
アーロンホール

@AaronHall興味深い、ソース?
-don.joey

1
証拠のためにこれを試してみてください。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は、
アーロン・ホール
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.