Модуль Python не найден в файле, когда он вызывается из другого каталога, но не тогда, когда он выполняется напрямую

#python #import #python-import

#python #импорт #python-импорт

Вопрос:

Итак, в основном у меня есть файловая структура lile

 directory
/subdirecrory
  >view.py
  >view_model.py
  >controller.py
>main.py
 

Мой контроллер выглядит примерно так:

 import view

startChat()
#^ for testing, to see if the import works when directly calling file

def startChat(socket):
    #datahandling
    view.startGui()
 

Мое мнение просто:

 import tkinter

def startGui():
    gui = tkinter.Tk()
    gui.mainloop()
 

И, наконец, основной:

 from subdirectory import controller

if __name__ == '__main__':
    controller.startChat(s)
 

Я удалил все содержимое, чтобы перейти к запуску графического интерфейса. Когда я запускаю контроллер, все работает так, как должно, если я помещаю main в подкаталог, он также работает.

Важное примечание: это исправление, но не то, что я хочу. Мне скоро снова понадобятся разные файлы, папки и каталоги, и если нет способа сделать это, хотелось бы узнать решение этой проблемы, которое не предполагает помещения всего в одну папку.

Если я запущу программу в том виде, в каком она есть сейчас, она выполнит controller.py , если я помещу print() над импортом (которых у меня несколько, например, sys и time, которые все работают), он завершится неудачей только после того, как достигнет import view

Сообщение об ошибке — это:

 Exception has occurred: ModuleNotFoundError
No module named 'chat_view
 

Моя теория заключается в том, что при вызове из другого каталога среда выполнения не имеет информации о папке, в которую она помещена, и не может сделать то, что произошло бы, если бы я запустил его из каталога. Это то, что я пытался исправить в первом и третьем решениях других вещей, которые я пробовал до сих пор:

  • Ввод «из подкаталога import view», но это не сработало
  • Поиск этого вопроса в Google не увенчался успехом
  • Импорт представления в главном
  • Добавление init.py в подкаталог /

Как вы можете видеть, я больше пытаюсь и гадаю, и я думаю, что вряд ли я найду решение этой проблемы в ближайшее время, поэтому я решил спросить здесь. Я не удивлюсь, если это дубликат, но я не смог найти то, что искал.

Ответ №1:

Вместо абсолютного импорта вы можете использовать относительный импорт в вашем контроллере

 from . import view
 

точка означает, что он будет искать в той же папке.

Ответ №2:

Сработала странная вещь, которую, я надеюсь, кто-нибудь еще сможет ОБЪЯСНИТЬ, но здесь для дальнейшего использования то, что я сделал, было:

Я помещаю все файлы в каталог с именами «src», например

 directory/src #this is how it is displayed in VSC, idk why it is not displayed as extra directory but like this?
  main.py
  /subdirectory
    __init__.py
    #other files
 

Я сделал это, чтобы очистить свой код, но затем в контроллере импорт import view больше не работал, поэтому, когда я изменил его на from subdirectory import view (что ранее вызывало ошибку), теперь он работает, вызывая его из main.py

Для меня это странно, поскольку все, что я сделал, это добавил каталог, но это работает, так что, да. На данный момент это принятый ответ, пока кто-нибудь не объяснит это лучше меня, тогда я его переключу