web-dev-qa-db-ja.com

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

サブフォルダーをモジュールとしてインポートしたい。したがって、すべてのサブフォルダーには__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
85
Razer

ここでPYTHONPATHsys.pathをいじる必要はありません。

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

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

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

from .dirfoo1.foo1 import Foo1
from .dirfoo1.foo1 import Foo2
113
Rob Wouters

ここで通知するだけです。 (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から、Generic-Class-Folderファイル内の「targetClass.py」ファイルをインポートして、「targetClass.py」ファイルの「functionExecute」という名前の関数を使用したかった

どのコマンドを実行しましたか?

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

多くの検索を試み、多くのstackoverflowの質問を見て、何が悪いのか判断できませんでした。私はファイルを複数回クロスチェックしました。__init__.pyファイルを使用し、環境パスを挿入し、何がうまくいかなかったかを非常に心配しました......

そして、長い長い時間の後、私は私の友人と話をしながらこれを理解しました。そのような命名規則を使用するのは少し愚かです。フォルダーやファイルの名前を定義するためにスペースや特殊記号を使用しないでください。だから、これが私が伝えたかったことです。良い一日を過ごしてください!

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

17
Vivek22

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

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

import os
import sys
sys.path.insert(0, os.getcwd())
5
Max Kamenkov

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

+---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
Flavio Wuensche