Подтвердить что ты не робот

ModuleNotFoundError: Что значит __main__ - это не пакет?

Я пытаюсь запустить модуль из консоли. Структура моего каталога такая:

enter image description here

Я пытаюсь запустить модуль p_03_using_bisection_search.py из каталога problem_set_02 используя:

$ python3 p_03_using_bisection_search.py

Код внутри p_03_using_bisection_search.py:

__author__ = 'm'


from .p_02_paying_debt_off_in_a_year import compute_balance_after


def compute_bounds(balance: float,
                   annual_interest_rate: float) -> (float, float):

    # there is code here, but I have omitted it to save space
    pass


def compute_lowest_payment(balance: float,
                           annual_interest_rate: float) -> float:

    # there is code here, but I have omitted it to save space
    pass    

def main():
    balance = eval(input('Enter the initial balance: '))
    annual_interest_rate = eval(input('Enter the annual interest rate: '))

    lowest_payment = compute_lowest_payment(balance, annual_interest_rate)
    print('Lowest Payment: ' + str(lowest_payment))


if __name__ == '__main__':
    main()

Я импортирую функцию из p_02_paying_debt_off_in_a_year.py код которой:

__author__ = 'm'


def compute_balance(balance: float,
                    fixed_payment: float,
                    annual_interest_rate: float) -> float:

    # this is code that has been omitted
    pass


def compute_balance_after(balance: float,
                          fixed_payment: float,
                          annual_interest_rate: float,
                          months: int=12) -> float:

    # Omitted code
    pass


def compute_fixed_monthly_payment(balance: float,
                                  annual_interest_rate: float) -> float:

    # omitted code
    pass


def main():
    balance = eval(input('Enter the initial balance: '))
    annual_interest_rate = eval(
        input('Enter the annual interest rate as a decimal: '))
    lowest_payment = compute_fixed_monthly_payment(balance,
                                                   annual_interest_rate)
    print('Lowest Payment: ' + str(lowest_payment))


if __name__ == '__main__':
    main()

Я получаю следующую ошибку:

ModuleNotFoundError: No module named '__main__.p_02_paying_debt_off_in_a_year'; '__main__' is not a package

Я понятия не имею, как решить эту проблему. Я попытался добавить файл __init__.py, но он все еще не работает.

4b9b3361

Ответ 1

Просто удалите точку для относительного импорта и выполните:

from p_02_paying_debt_off_in_a_year import compute_balance_after

Ответ 2

У меня та же проблема, что и у вас. Я думаю, что проблема в том, что вы использовали относительный импорт в in-package import. В вашем каталоге нет __init__.py. Так что просто импортируйте, как Моисей ответил выше.

Я думаю, что основная проблема заключается в импорте с точкой:

from .p_02_paying_debt_off_in_a_year import compute_balance_after

Это эквивалентно:

from __main__.p_02_paying_debt_off_in_a_year import compute_balance_after

где __main__ относится к вашему текущему модулю p_03_using_bisection_search.py.


Вкратце, интерпретатор не знает вашей архитектуры каталогов.

Когда интерпретатор попадает в p_03.py, сценарий равен:

from p_03_using_bisection_search.p_02_paying_debt_off_in_a_year import compute_balance_after

и p_03_using_bisection_search не содержат никаких модулей или экземпляров, называемых p_02_paying_debt_off_in_a_year.


Поэтому я нашел более чистое решение без изменения ценностей среды Python (после просмотра того, как запросы выполняют относительный импорт):

Основная архитектура каталога:

main.py

setup.py

--- problem_set_02/

------ __init__.py

------ p01.py

------ p02.py

------ p03.py

Затем напишите в __init__.py:

from .p_02_paying_debt_off_in_a_year import compute_balance_after

Здесь __main__ - это __init__, это в точности относится к модулю problem_set_02.

Затем перейдите к main.py:

import problem_set_02

Вы также можете написать setup.py для добавления определенного модуля в среду.

Ответ 3

Попробуйте запустить его как:

python3 -m p_03_using_bisection_search

Ответ 4

Привет Пожалуйста, следуйте ниже шаг, вы решите эту проблему. Если вы создали каталог и подкаталог, выполните следующие шаги, и имейте в виду, что во всех каталогах должен быть __init__.py, чтобы он распознавался как каталог.

  1. import sys и запустите sys.path, вы сможете увидеть все пути, которые ищет python. Вы должны видеть ваш текущий рабочий каталог.

  2. Теперь импортируйте подкаталог и соответствующий модуль, который вы хотите использовать, используя import, следуя этой команде: import subdir.subdir.modulename as abc, и теперь вы можете использовать методы этого модуля. ScreenShotforSameIssue

как вы можете видеть на этом скриншоте, у меня есть один родительский каталог и два подкаталога, а под вторым подкаталогами у меня есть модуль == CommonFunction и вы видите правую сторону после выполнения sys.path я вижу мой рабочий каталог

Ответ 5

Удалите точку и импортируйте absolute_import в начале вашего файла

from __future__ import absolute_import

from p_02_paying_debt_off_in_a_year import compute_balance_after