web-dev-qa-db-ja.com

Python相対パスをインポート

他のディレクトリにあるpythonクラスを使用したいプロジェクトがあります。

構造例:

/dir
 +../subdirA
 +../subdirB
 +../mydir

このプロジェクトは異なるマシンで実行されるため、絶対パスは異なります。

My python MySampleClass with / mydirにあるファイルが実行される場合、どのようにインポートしますかOtherClassRootにあります/ dirまたはOtherClassAにある/ subdirA

私は次のようなことを試しました:

from . import MySampleClass as msc

または

from ../ import MySampleClass as msc

しかし、これは常に失敗するか、非パッケージでの相対インポートの試行

だから、pythonファイルを比較的インポートする正しい方法は何ですか?

17
daniel451

Mydirディレクトリに__init__.pyが必要であり(空でもかまいません)、mySampleClassがmyfile.pyに、myfile.pyがmydirにあると仮定して、dirがsysパスにある限り、

from mydir.myfile import MySampleClass

SubdirAにあるutil.pyというファイルからmyfile.py(クラスがある場所)にトップレベル関数をインポートする場合、__init__.pyがsubdirAにあり、次にmyfile.pyにある必要があります。

from subdirA.util import somefunc, someotherfunc

Sysパスについても同様です。つまり、「dir」から開始するか、追加する必要があります。すべてがパッケージの最上位レベル(通常はプロジェクトフォルダー)からインポートされます。

ただし、インタープリターでutilから関数を実行するモジュールテストでは、subdirAから開始する場合、インポートを解決できるようにsysパスにdirを追加する必要があります。

>>> import sys
>>> sys.path.append('../dir')

ただし、これはハックであり、テスト中にインタープリターからのみ使用することをお勧めします。 pthファイルでサイトパッケージに「dir」を追加することもできます。

相対的なインポートを使用するには、subdirA/subdirofAなどのより深いネストされたフォルダーが必要であり、subdirofAではを使用できます。バックアウトする(from .subdirBなど)。本当に、私にとって、相対的なインポートはユーティリティを見るのが少し難しいです。プロジェクトディレクトリに対して直接インポートを使用する方が良いが、素朴なサブパッケージを入れ子にしたい場合は便利であることがわかりましたが、繰り返しますが、可能であれば暗黙的よりも明示的である方が良いでしょう。

this も参照してください

20
Wyrmwood

最初に相対パスをpythonpathに追加します

import os

import sys

cwd = os.getcwd()

sys.path.append(cwd + '/../subdirA/')

sys.path.append(cwd + '/../subdirB/')

次に、モジュールをインポートします。

2
reggie