他のディレクトリにある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ファイルを比較的インポートする正しい方法は何ですか?
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 も参照してください
最初に相対パスをpythonpathに追加します
import os
import sys
cwd = os.getcwd()
sys.path.append(cwd + '/../subdirA/')
sys.path.append(cwd + '/../subdirB/')
次に、モジュールをインポートします。