Ответ 1
Просто удалите точку для относительного импорта и выполните:
from p_02_paying_debt_off_in_a_year import compute_balance_after
Я пытаюсь запустить модуль из консоли. Структура моего каталога такая:
Я пытаюсь запустить модуль 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
, но он все еще не работает.
Просто удалите точку для относительного импорта и выполните:
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__
- это __init__
, это в точности относится к модулю problem_set_02
.
Затем перейдите к main.py
:
import problem_set_02
Вы также можете написать setup.py
для добавления определенного модуля в среду.
Попробуйте запустить его как:
python3 -m p_03_using_bisection_search
Привет Пожалуйста, следуйте ниже шаг, вы решите эту проблему.
Если вы создали каталог и подкаталог, выполните следующие шаги, и имейте в виду, что во всех каталогах должен быть __init__.py
, чтобы он распознавался как каталог.
import sys
и запустите sys.path
, вы сможете увидеть все пути, которые ищет python. Вы должны видеть ваш текущий рабочий каталог.
Теперь импортируйте подкаталог и соответствующий модуль, который вы хотите использовать, используя import, следуя этой команде: import subdir.subdir.modulename as abc
, и теперь вы можете использовать методы этого модуля.
ScreenShotforSameIssue
как вы можете видеть на этом скриншоте, у меня есть один родительский каталог и два подкаталога, а под вторым подкаталогами у меня есть модуль == CommonFunction и вы видите правую сторону после выполнения sys.path я вижу мой рабочий каталог
Удалите точку и импортируйте absolute_import в начале вашего файла
from __future__ import absolute_import
from p_02_paying_debt_off_in_a_year import compute_balance_after