Подтвердить что ты не робот

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

Я хочу импортировать подпапки в качестве модулей. Поэтому каждая подпапка содержит a __init__.py. Моя структура папок такова:

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

В моем основном script я импортирую

from dirFoo.foofactory import FooFactory

В этом файле factory я включаю вспомогательные модули:

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
4b9b3361

Ответ 1

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

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

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

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

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

Ответ 2

Просто чтобы сообщить об этом. (от новичка, keviv22)

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

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

  • Generic-классы-папка
  • 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 в файл Generic-Class-Folder для использования функции с именем "functionExecute" в файле "targetClass.py"

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

  • из 'testFile.py', написал команду, из функции импорта ядра Core.Generic-Class-Folder.targetClassExecute
  • Получены ошибки, такие как "Синтаксис: недействительный синтаксис"

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

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

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

Ответ 3

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

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

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

Ответ 4

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

+---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)

Ответ 5

я добавляю __init__.py в каждую подпапку и импортирую так: из dirFoo.dirFoo1.foo1 импортируем Foo1 из dirFoo.dirFoo2.foo2 импортируем Foo2

я все еще получаю ошибку: ImportError: нет модуля с именем dirFoo1.foo1

Зачем?

Ответ 6

Были проблемы, даже когда init.py существовал в подпапке и все, чего не хватало, это добавить "как" после импорта

from folder.file import Class as Class
import folder.file as functions