ModuleNotFoundError:什么意思__main__不是一个包?

我正在尝试从控制台运行一个模块。我的目录结构是这样的:

enter image description here

我试图运行模块p_03_using_bisection_search.py,从problem_set_02目录使用:

$ python3 p_03_using_bisection_search.py

__abc0中的代码是:

__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文件,但它仍然不工作。

329721 次浏览

简单地删除相对导入的点,然后执行:

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来将特定的模块添加到环境中。

如果你已经创建了目录和子目录,请按照以下步骤执行,请记住所有目录必须有__init__.py才能将其识别为目录。

  1. 在你的脚本中,包括import syssys.path,你将能够看到Python可用的所有路径。您必须能够看到当前的工作目录。

  2. 现在导入子目录和你想使用的模块,使用import subdir.subdir.modulename as abc,现在你可以使用该模块中的方法。

enter image description here

作为一个例子,你可以在这个截图中看到,我有一个父目录和两个子目录,在第二个子目录下,我有模块CommonFunction。在右边,我的控制台显示在执行sys.path之后,我可以看到我的工作目录。

试着运行它:

python3 -m p_03_using_bisection_search

删除圆点并导入文件开头的absolute_import

from __future__ import absolute_import


from p_02_paying_debt_off_in_a_year import compute_balance_after

只需使用.py文件所在的主文件夹的名称。

from problem_set_02.p_02_paying_debt_off_in_a_year import compute_balance_after