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

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

введите описание изображения здесь

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

 $ python3 p_03_using_bisection_search.py 

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

 __author__ = 'm' """ Docstring """ from .p_02_paying_debt_off_in_a_year import compute_balance_after def compute_bounds(balance: float, annual_interest_rate: float) -> (float, float): """" Docstring """ # there is code here, but I have omitted it to save space pass def compute_lowest_payment(balance: float, annual_interest_rate: float) -> float: """ Docstring """ # 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' """ Docstring """ def compute_balance(balance: float, fixed_payment: float, annual_interest_rate: float) -> float: """ Docstring """ # 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: """ Docstring """ # Omitted code pass def compute_fixed_monthly_payment(balance: float, annual_interest_rate: float) -> float: """ Docstring """ # 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 , но он все еще не работает.

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

 from p_02_paying_debt_off_in_a_year import compute_balance_after 

У меня такая же проблема, как и у вас. Я думаю, проблема заключается в том, что вы использовали относительный импорт в импорт внутри 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__ is __init__ , он точно относится к модулю problem_set_02 .

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

import problem_set_02

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