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