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 шт):

Автор решения: Dart5678899765444

Мне помогло следующие:

# 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 даже трогать не придётся!!! Это и решило полностью мой вопрос!!!

→ Ссылка
Автор решения: Kontata

наверное это делается так:

from folder1 import module1

точно уже не помню, но если вспомню, поправлю свой вариант

→ Ссылка