Неожиданное поведение в модуле python не найдено

#python-3.x #pyqt5 #centos8

#python-3.x #pyqt5 #centos8

Вопрос:

Я пытаюсь создать приложение с графическим интерфейсом PyQt5. У меня есть python3.6 и pyqt5, установленные на Centos-8. Структура каталогов выглядит следующим образом:

 Workspace/
├── app.py
├── Controller
├── Model
└── View
    ├── ContentLayout
    │   ├── UserActions
    │   │   └── ButtonLayout.py
    │   └── UserInput
    │       └── TextInputLayout.py
    ├── FooterLayout
    ├── HeaderLayout
    ├── mainMenu.py

 

app.py:

 # This is main application
from View.mainMenu import MenuDesign

if __name__ == "__main__":
    test = MenuDesign()
    test.genereateLayout()
 

mainMenu.py:

 from ContentLayout.UserInput.TextInputLayout import TextInput
from PyQt5.QtWidgets import QMainWindow

class MenuDesign(QMainWindow):
    def __init__(self):
        super().__init__()
        pass

    def genereateLayout(self):
        self.userinput = TextInput()
        self.userinput.initialize_label()
        self.userinput.initialize_textinput()
        print("Function called from TextInputLayout")

 

TextInputLayout.py:

 # This is class for designing layouts for text input boxes and status bar.
class TextInput:
    """This is main class for user inputs."""
    def __init__():
        pass

    def initialize_label(self):
        print("Function is printing from TextInputLayout")
        pass

    def initialize_textinput(self):
        print("Function is printing textinput from TextInputLayout")
        pass

 

Когда я запускаю приложение, я получаю следующую ошибку:

 Traceback (most recent call last):
  File "app.py", line 1, in <module>
    from View.mainMenu import MenuDesign
  File "/home/amarjeets/Workspace/View/mainMenu.py", line 2, in <module>
    from ContentLayout.UserInput.TextInputLayout import TextInput
ModuleNotFoundError: No module named 'ContentLayout'
 

Я попытался вставить __init__.py файл View ContentLayout и UserInput папки со всеми перестановками / комбинациями по-прежнему с той же ошибкой.
Есть ли какое-либо правило или общее руководство, которому мне нужно следовать, чтобы импортировать модуль / класс / функцию в python из заданной папки проекта / файловой структуры, подобной моей?

И

если у меня также есть файл, например consolidatedLayout.py , в папке ContentLayout со всеми остальными файлами, то как импортировать модули из ButtonLayout.py или TextInputLayout.py в consolidatedLayout.py

Комментарии:

1. Я думаю, что у вас также должна быть __init__.py внутренняя часть папки app.py , чтобы она работала.

2. @HampusLarsson сэр .. я тоже проверил это … та же ошибка. Я даже поместил __init__.py во все папки ту же ошибку.

Ответ №1:

У меня следующая структура папок:

 C:.
│   app.py
│   __init__.py
│
└───View
    │   MainScript.py
    │   __init__.py
    │
    └───Folder1
            sub1.py
            __init__.py
 

app.py :

 from View.MainScript import Test

print(Test.x)
Test.p()
 

MainScript.py :

 from View.Folder1.sub1 import printIt

class Test:
    x = 123
    p = printIt
 

sub1.py :

 def printIt():
    print("printed inside of sub1.py")
 

Когда я запускаю app.py это вывод:

 123
printed inside of sub1.py
 

Обратите внимание, что импорт внутри MainScript — это from View.Folder1.sub1 import printIt где View находится папка «выше», которая считается той module , из которой вы импортируете.

Комментарии:

1. Спасибо за ответ. Поэтому я должен импортировать модули из корневого пути (где запускается основной поток, т. е. app.py ) или мне нужно импортировать только из одной папки выше?

2. Вы должны думать о структуре папок как о самом модуле, и вы должны указать «путь» к файлам, которые вы хотите импортировать. Так что да, вы должны смотреть на это так, как будто ваши файлы импортируются из «корневой» папки.