Неожиданное поведение в модуле Python не обнаружено

Я пытаюсь создать приложение с графическим интерфейсом 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

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

Hampus Larsson 23.12.2020 09:52

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

Amarjeet Sharma 23.12.2020 10:04
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
2
83
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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, из которой вы импортируете.

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

Amarjeet Sharma 23.12.2020 12:34

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

Hampus Larsson 23.12.2020 13:53

Другие вопросы по теме