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