Модуль импорт из папки


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

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

просто уведомить здесь. (от 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" в 'targetClass.py-файл

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

  • от 'testFile.py', написал команду, из ядра.Универсального Класса-Папка.targetClass import 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)