我正在尝试从控制台运行一个模块。我的目录结构如下:
我正在尝试使用以下命令从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
文件,但它仍无效。
答案 0 :(得分:137)
只需删除相对导入的点,然后执行:
from p_02_paying_debt_off_in_a_year import compute_balance_after
答案 1 :(得分:54)
我和你一样有同样的问题。我认为问题是你在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环境的贵重物品(在查找requests相对导入的方式后):
目录的主要架构是:
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
以将特定模块添加到环境中。
答案 2 :(得分:3)
您好请按照以下步骤操作,您将解决此问题。 如果您已创建目录和子目录,请按照以下步骤操作,请记住所有目录必须包含" init .py"将其识别为目录。
" import sys"并运行" sys.path" ,您将能够看到python正在搜索的所有路径。您必须能够看到当前的工作目录。
现在使用import导入子目录和要使用的相应模块遵循以下命令:" import subdir.subdir.modulename as abc "现在您可以使用该模块中的方法。 ScreenShotforSameIssue
你可以在这个截图中看到我有一个父目录和两个子目录,在第二个子目录下我有模块== CommonFunction 并且在执行sys.path后看到右侧我可以看到我的工作目录
答案 3 :(得分:2)
尝试以以下方式运行它:
python3 -m p_03_using_bisection_search
答案 4 :(得分:1)
删除点并在文件开头导入absolute_import
from __future__ import absolute_import
from p_02_paying_debt_off_in_a_year import compute_balance_after
答案 5 :(得分:1)
只需使用.py文件所在的主文件夹的名称即可。
from problem_set_02.p_02_paying_debt_off_in_a_year import compute_balance_after
答案 6 :(得分:-1)
删除“.”后问题仍未解决,然后它开始将错误指向我的文件夹。当我第一次添加这个文件夹时,我重新启动了 PyCharm,它自动解决了这个问题