Я пытаюсь запустить модуль из консоли. Структура моего каталога такая:
Я пытаюсь запустить модуль 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
файл, но он все еще не работает.
python
module
python-3.6
python-import
lmiguelvargasf
источник
источник
eval(input...
вероятно, это не очень хорошая идея. Я бы просто проанализировал это вместо того, чтобы открыть возможность для выполнения произвольного кода.eval(input(...
бит был предложен 2to3. Я сделал это сегодня со мной. рад, что я не следую его предложениям ослепительноОтветы:
Просто удалите точку для относительного импорта и выполните:
источник
__init__.py
?__init__.py
в той же папке), хотя мой PyCharm (2018.2.4) помечает это как «неразрешенную ссылку» и не может автоматически завершить импорт.from ..sibling_pkg.nephew import my_function
действительно для PyCharm, но приводит кValueError: attempted relative import beyond top-level package
и MyPyCannot find module named '.sibling_pkg.nephew'
(обратите внимание на один «.» В ошибке, а не два). Тем не менее,from sibling_pkg.nephew import my_function
работает как задумано, не имеет ошибки MyPy, но приводит к ошибке PyCharm.У меня та же проблема, что и у вас. Я думаю, проблема в том, что вы использовали относительный импорт в
in-package import
. Там нет__init__.py
в вашем каталоге. Так что просто импортируйте, как Моисей ответил выше.Основная проблема, которую я думаю, это когда вы импортируете с точкой:
Это эквивалентно:
где
__main__
относится к вашему текущему модулюp_03_using_bisection_search.py
.Вкратце, интерпретатор не знает вашей архитектуры каталогов.
Когда переводчик входит
p_03.py
, сценарий равен:и
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
:Вот
__main__
это__init__
, это точно относится к модулюproblem_set_02
.Затем перейдите к
main.py
:import problem_set_02
Вы также можете написать,
setup.py
чтобы добавить определенный модуль в среду.источник
Попробуйте запустить его как:
python3 -m p_03_using_bisection_search
источник
Если вы создали каталог и подкаталог, следуйте приведенным ниже инструкциям и имейте в виду, что все каталоги должны быть
__init__.py
распознаны как каталог.В вашем скрипте include
import sys
иsys.path
вы сможете увидеть все пути, доступные для Python. Вы должны быть в состоянии увидеть ваш текущий рабочий каталог.Теперь импортируйте подкаталог и соответствующий модуль, который вы хотите использовать, используя:
import subdir.subdir.modulename as abc
и теперь вы можете использовать методы этого модуля.В качестве примера, вы можете увидеть на этом скриншоте у меня есть один родительский каталог и два подкаталога, а во втором подкаталоге у меня есть модуль
CommonFunction
. Справа моя консоль показывает, что после выполненияsys.path
я вижу свой рабочий каталог.источник
Удалите точку и импортируйте absolute_import в начале вашего файла
источник
Просто используйте имя основной папки, в которой находится .py файл.
источник