当文件位于不同文件夹时导入模块时出现问题

Problem when importing modules when files are at different folders

目的

我编写了 2 个运行良好的程序。现在,我想为这两个程序创建一个 GUI。我的想法是创建一个 window,在其中 select 您想要 运行 的软件,然后根据您单击的内容,将打开一个新的 window。此 window 将用于询问用户我在执行这两个软件之前手动输入的输入。然后,在这个新的 window 中,用户将单击一个按钮,软件将使用用户输入的参数加载。

软件将运行使用Qt5和python 3.

我如何进行

我使用 Qt Designer 创建了 3 个文件。一个是主 window(main.py,它创建一个名为 frame_init 的 window),当用户单击一个按钮时,它会打开第二个 window。这个第二个window是第一个软件还是第二个软件都不一样。例如,要打开软件 1,我有:

def open_software_first(self):
    self.software_first = QtWidgets.QMainWindow()
    self.ui = Ui_software_first()
    self.ui.setupUi(self.software_first)
    self.software_first.show()   #the file is called first.py
    frame_init.hide()  

在 first.py 中有一个按钮,用户可以按下该按钮来启动一切:

import A.main as start_functions
def start_first_software(self):
    self.btn_start.setEnabled(False)
    start_functions.start(values) #values are different properties from checkbox, inputlines...

在这里,我所做的是将3个文件放在一个文件夹中。创建两个文件夹(A 用于软件 1,B 用于软件 2)并将每个软件的文件放在其自己的文件夹中。这就是导入具有此 A 的原因。在所有文件夹中,我放置了一个名为“__ init__.py”的空文件。最初,我运行打开软件frame_init。对于此处评论的文件,结构为:

 application  
  ├── __init__.py
  ├── main.py
  ├── first.py 
  ├── second.py 
  ├── A
      └── __init__.py  
      └── main.py
      └── AAAAAA.py
      └── BBBBBB.py
      └── ...
  ├── B
      └── __init__.py  
      └── ...

问题

如何导入必须在A文件夹中的软件1的主目录中?要在 main 中的其他文件中导入函数,我使用的是:

import AAAAA as a
import BBBBB as b

等等。现在,它不起作用。我必须输入:

import A.AAAAA as a
import A.BBBBB as b

所以它就像是从加载 GUI 的文件夹中导入。问题是,例如在文件 AAAAA 中,我导入了 BBBBB:

import BBBBB as b

在文件 BBBBB 中我需要 AAAAA:

import AAAAA as a

main 加载“导入 A.AAAAA 作为”。然后它调用 AAAAA 中的一个函数。此函数使用 BBBBB 中的一个函数。现在当加载 BBBBB 中的函数时出现错误:

“ModuleNotFoundError:没有名为 'AAAAA' 的模块”。如果我输入 A.AAAAA 然后它说:“AttributeError:模块 'A' 没有属性 'AAAAA'”

我必须如何加载这个导入?很抱歉post这里没有一个可行的例子,但如果我把所有东西都放上去,我的东西太乱了...

我终于开始工作了!

Sorin's answer 之后,将该代码复制到子文件夹中的每个文件,将其代码中的“子文件夹”文本更改为您的子文件夹的名称,然后导入所有内容,就好像它们在同一个文件夹中一样文件夹,一如既往。不要输入一些文件“import subfolder.yourpyfile as XXX”和其他文件“import yourpyfile as XXX”。始终将它们全部放入“将您的文件导入为 XXX”。不知道为什么会失败,但这行得通。不要忘记在每个文件夹中包含那些空的 init.py 文件。

PS。不要将文件包含在两个同名文件夹中。导入将加载一个,但不会加载另一个。