サブフォルダーからモジュールをインポート


104

サブフォルダーをモジュールとしてインポートしたい。したがって、すべてのサブフォルダにはが含まれてい__init__.pyます。私のフォルダ構造は次のとおりです:

src\
  main.py
  dirFoo\
    __init__.py
    foofactory.py
    dirFoo1\
      __init__.py
      foo1.py
    dirFoo2\
      __init__.py
      foo2.py

私のメインスクリプトでインポート

from dirFoo.foofactory import FooFactory

このファクトリファイルには、サブモジュールを含めます。

from dirFoo1.foo1 import Foo1
from dirFoo2.foo2 import Foo2

私がfoofactoryを呼び出すと、エラーが発生し、そのPythonはサブモジュールfoo1およびfoo2をインポートできません。

Traceback (most recent call last):
  File "/Users/tmp/src/main.py", line 1, in <module>
from dirFoo.foofactory import FooFactory
  File "/Users/tmp/src/dirFoo/foofactory.py", line 1, in    <module>
from dirFoo1.foo1 import Foo1
    ImportError: No module named dirFoo1.foo1

回答:


136

あなたPYTHONPATHやを台無しにする必要はありませんsys.pathここ。

パッケージで絶対インポートを適切に使用するには、「ルート」パッケージ名も含める必要があります。例:

from dirFoo.dirFoo1.foo1 import Foo1
from dirFoo.dirFoo2.foo2 import Foo2

または、相対インポートを使用できます。

from .dirfoo1.foo1 import Foo1
from .dirfoo2.foo2 import Foo2

47
覚えておかなければならないことが1つあります。__init__.pyインポート元のすべてのサブフォルダーに追加します。
2015

6
__init__.pyは仕事をするかもしれません。
cerebrou 2017年

1
以前Foo1は親ディレクトリにあり、1つがのようにコーディングされていた場合、構文はどうなるでしょうfrom Foo1 import *。同じ効果を達成する方法はあるので、すべての接頭辞を付ける必要はありませんFoo1か?
jxramos

1
@AzizAlto:コメントがなければ、このソリューションはあまり役に立ちません
Alex

21

ここで通知するだけです。(newbee、keviv22から)

自分のためにフォルダやファイルに「-」や「_」などの記号を付けてください。そうした場合、いくつかの問題に直面する可能性があります。私のように、インポートのコマンドは正しいですが、そのような名前のフォルダー内で利用できる必要なファイルを正常にインポートすることはできません。

次のような無効なフォルダの名前:

  • Generic-Classes-Folder
  • Generic_Classes_Folder

上記の有効なフォルダ名:

  • GenericClassesFolderまたはGenericclassesfolderまたはgenericClassesFolder(または、単語間にスペースや特別な記号を付けずにこのように)

私がした間違い:

ファイル構造を検討してください。

Parent
   . __init__.py
   . Setup
     .. __init__.py
     .. Generic-Class-Folder
        ... __init__.py
        ... targetClass.py
   . Check
     .. __init__.py
     .. testFile.py

私がやりたかったことは?

  • testFile.pyから、「targetClass.py」ファイル内の「functionExecute」という名前の関数を使用するために、Generic-Class-Folderファイル内の「targetClass.py」ファイルをインポートしたかった

私がしたコマンドは?

  • 「testFile.py」から、コマンドを書きました、 from Core.Generic-Class-Folder.targetClass import functionExecute
  • 次のようなエラーが発生しました SyntaxError: invalid syntax

多くの検索を試行し、多くのスタックオーバーフローの質問を表示しましたが、何が問題だったかを判断できませんでした。私は自分のファイルを複数回クロスチェックしました、私は使用しました__init__.py、環境パスを挿入し、何がうまくいかなかったかを非常に心配しました......

そして久しぶりに、友達と話しているうちにこれがわかりました。私はそのような命名規則を使うのは少しばかげています。フォルダーやファイルの名前を定義するのに、スペースや特殊記号を使用しないでください。だから、これが伝えたかったことです。良い一日を過ごしてください!

(これについての巨大な投稿をごめんなさい...ちょうど私の欲求不満を手放すように.... :)ありがとう!)


22
スペースとダッシュ( "-")はこれを引き起こしますが、アンダースコア( "_")は引き続き正常に機能します。
カウリネーター2017

6

PYTHONPATH環境変数を設定します。たとえば、このようなPYTHONPATH =。:..(* nixファミリの場合)。

また、現在のディレクトリ(この場合はsrc)を手動でpythonpathに追加することもできます。

import os
import sys
sys.path.insert(0, os.getcwd())

2

プロジェクトが次のように構成されているとします。

+---MyPythonProject
|   +---.gitignore
|   +---run.py
|   |   +---subscripts
|   |   |   +---script_one.py
|   |   |   +---script_two.py

内部ではrun.py、次の方法でスクリプト1および2をインポートできます。

from subscripts import script_one as One
from subscripts import script_two as Two

これで、まだ内でrun.py、次のメソッドを使用してそれらのメソッドを呼び出すことができます。

One.method_from_one(param)
Two.method_from_two(other_param)

1

空の___init____.pyファイルを作成し、他のpythonモジュールがあるpythonアプリケーションのすべてのサブディレクトリ/フォルダーと同様に、ルートに追加します。


-2

init .pyがサブフォルダーに存在し、インポート後に「as」を追加するだけで問題が発生した

from folder.file import Class as Class
import folder.file as functions
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.