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