Импорт модуля из подпапки

Я хочу импортировать вложенные папки в качестве модулей. Поэтому каждая подпапка содержит __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

4 ответов


нет необходимости возиться с вашим PYTHONPATH или sys.path здесь.

чтобы правильно использовать абсолютный импорт в пакете, вы должны также включить имя пакета" root", например:

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

или вы можете использовать относительный импорт:

from .dirfoo1.foo1 import Foo1
from .dirfoo1.foo1 import Foo2

просто уведомить здесь. (от Ньюби, keviv22)

никогда и никогда ради собственного блага не называйте папки или файлы с пробелами или символами, такими как "-" или "_". Если вы сделали это, вы можете столкнуться с несколькими проблемами. как и мой, скажем, хотя ваша команда для импорта верна, вы не сможете успешно импортировать нужные файлы, которые доступны внутри таких именованных папок.

недопустимые имена папок как следует:

  • Generic-Classes-Папка
  • 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" в "targetClass.py-файл

какую команду я сделал?

  • от 'testFile.py', написал команду, из ядра.Папка Универсального Класса.targetClass импорт functionExecute
  • получил ошибки, такие как"SyntaxError: недопустимый синтаксис"

пробовал много поисков и просмотрел много вопросов stackoverflow и не смог решить, что пошло не так. Я проверил свои файлы несколько раз, я использовал __init__.py файл, вставленный путь к среде и очень беспокоился о том, что пошло не так......

и после долгого-долгого времени я понял это, разговаривая со своим другом. Я немного глуп, чтобы использовать такие именования. Я никогда не должен использовать пространство или специальные символы для определения имени любой папки или файла. Вот что я хотел сказать. Хорошо день!

(извините за огромный пост по этому поводу... просто отпускаю свое разочарование.... :) Спасибо!)


установите переменную среды PYTHONPATH. Например, как этот PYTHONPATH=.:.. (для семьи * nix).

также вы можете вручную добавить свой текущий каталог (src в вашем случае) в pythonpath:

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

скажем, ваш проект структурирован следующим образом:

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

внутри run.py, вы можете импортировать скрипты один и два по:

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)