#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
Для меня это странно, поскольку все, что я сделал, это добавил каталог, но это работает, так что, да. На данный момент это принятый ответ, пока кто-нибудь не объяснит это лучше меня, тогда я его переключу