簡體   English   中英

文件位於不同文件夾時導入模塊時出現問題

[英]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

主要加載“將 A.AAAAA 導入為 a”。 然后它在 AAAA 中調用 function。 此 function 在 BBBBB 中使用 function。 現在當加載 BBBBB 中的 function 時出現錯誤:

“ModuleNotFoundError:沒有名為‘AAAAA’的模塊”。 如果我輸入 A.AAAAA 那么它會說:“AttributeError:模塊'A'沒有屬性'AAAAA'”

我如何加載這個導入? 我很抱歉沒有在這里發布一個可行的例子,但如果我把所有東西都放在這里,我的事情就太亂了......

終於我開始工作了!

按照Sorin 的回答,將該代碼復制到子文件夾中的每個文件中,將其代碼中的“子文件夾”文本更改為您的子文件夾的名稱,然后像往常一樣導入所有內容,就好像它在同一個文件夾中一樣。 不要放入某些文件“import subfolder.yourpyfile as XXX”和其他“import yourpyfile as XXX”。 務必將所有這些都“導入您的pyfile作為XXX”。 不知道為什么它失敗了,但這有效。 不要忘記在每個文件夾中包含那些空的init .py 文件。

PS。 不要在兩個同名文件夾中包含文件。 導入將加載一個,但不會加載另一個。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM