Python从其他目录调用时在文件中发现ModuleNotFound,但直接执行时却没有

Python ModuleNotFound in file when it is called from other directory, but not when it is directly executed

基本上我有一个文件结构

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)

我删除了所有内容以减少我自己的 GUI 启动。当我 运行 控制器一切正常时,如果我将主目录放入子目录,它也可以正常工作。

重要说明:这是一个修复程序,但不是我想要的。我很快将再次需要不同的文件、文件夹和目录,除非没有办法做到这一点,否则我想知道一个不涉及将所有内容都放在同一个文件夹中的解决方案。

如果我 运行 现在的程序,它将执行 controller.py,如果我将 print() 放在导入之上(其中我有一些,比如 sys和时间,这一切都有效),它只会在到达 import view

时失败

错误消息是:

Exception has occurred: ModuleNotFoundError
No module named 'chat_view

我的理论是,当从另一个目录调用时,运行time 没有关于它放入的文件夹的信息,并且无法执行如果我从该目录启动它会发生的情况。这是我在迄今为止尝试过的其他事情的第一个和第三个解决方案中试图解决的问题:

正如您可能看到的那样,我更多的是在尝试和猜测,我认为我不太可能很快找到解决这个问题的方法,所以我想在这里问一下。如果这是重复的,我不会感到惊讶,但我找不到我要找的东西。

您可以在控制器中使用相对导入,而不是绝对导入

from . import view

圆点表示它将在同一文件夹中搜索。

一件奇怪的事情发生了,我希望其他人可以解释,但为了将来参考,我所做的是:

我把所有的文件都放到了一个名为“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

调用它

这对我来说很奇怪,因为我所做的只是添加一个目录,但它确实有效,所以,是的。这是目前公认的答案,直到有人解释得比我好,然后我会切换它