NameError: name 'module2' is not defined
Структура проекта:
project
|- main.py
|- folder1
|- module1.py
|- module2.py
В module1.py:
import module2
# my code
я пишу в main.py:
import folder1.module1
module1.hello_world()
и запускаю:
NameError: name 'module2' is not defined
Даже если импортировать так:
# main.py:
from folder1 from *
Он выдаст:
NameError: name 'module2' is not defined
как мне не добавляя полный путь или относительный - т.е без такой галиматьи:
# module1.py
import folder1.module2
# my code
спокойно импортировать только module1 не дописывая дополнительно путь как в примере выше?
У меня там просто оооочень много модулей которые зависят друг от друга и каждому полный путь переписывать не хотелось бы. Ведь если импортировать стандартные пакеты, то путь у зависимых модулей прописывать не требуется. Как-то так.
Если я сделаю папку folder1 пакетом python я решу этот вопрос?
Ответы (2 шт):
Мне помогло следующие:
# main.py:
import sys, os
sys.path.append(os.path.join(sys.path[0], 'folder1'))
Это добавляет новый относительный путь для поиска модулей - и не важно, где находиться папка с проектом. Правда если эти модули работают с локальными файлами (читают и пишут в них), то выдаст ошибку:
FileNotFoundError: [Errno 2] No such file or directory: "example.txt"
Вот что я понял, для python есть папки и пакеты, хотя это по сути одно и тоже, python не увидит модуль если просто поменять директорию(папку) вот так:
# Пример 1:
os.chdir('folder1')
но если сделать то же самое, но указать интерпретатору python пакет указав, где искать модули:
# Пример 2:
sys.path.append(os.path.join(sys.path[0], 'folder1'))
То о чудо, он увидит модуль и все модули в директории folder1 и не важно откуда запущен скрипт и где лежат папки проекта. Правда нужно при каждом запуске добавлять относительный путь заново!
Если просто добавить в sys.path относительный путь, то следует сменить директорию, как указано в примере 1, иначе модули в folder1 не смогут читать и писать в файлы в своей директории, ведь там указано:
open("example.txt") # относительный путь!
и чтобы не писать:
open("folder1/example.txt")
Для каждого вызова open(), можно просто вместе с примером 1 использовать пример 2!!!
И таким образом модули в folder1 даже трогать не придётся!!! Это и решило полностью мой вопрос!!!
наверное это делается так:
from folder1 import module1
точно уже не помню, но если вспомню, поправлю свой вариант