关于python:ModuleNotFoundError:这是什么意思__main__不是一个包?

ModuleNotFoundError: What does it mean __main__ is not a package?

我试图从控制台运行一个模块。我的目录结构如下:

enter image description here

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

1
$ python3 p_03_using_bisection_search.py

p_03_using_bisection_search.py中的代码是:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
__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中的函数,其代码是:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
__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()

我收到以下错误:

1
ModuleNotFoundError: No module named '__main__.p_02_paying_debt_off_in_a_year'; '__main__' is not a package

我不知道如何解决这个问题。我已经尝试添加一个__init__.py文件,但它仍然不起作用。


只需删除相对导入的点,然后执行以下操作:

1
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时,脚本等于:

江户十一〔七〕号

显然,p_03_using_bisection_search不包含任何称为p_02_paying_debt_off_in_a_year的模块或实例。

简而言之,解释器不知道您的目录体系结构。

因此,我提出了一个更干净的解决方案,而不更改Python环境中的贵重物品(在查找了相对导入中请求的方式之后):

目录的主要结构是:

埃多克斯1〔10〕

江户十一〔11〕。

——problem_set_02/

——埃多克斯1〔1〕。

——埃多克斯1〔14〕。

——埃多克斯1〔15〕。

——埃多克斯1〔16〕。

然后在EDOCX1[1]中写入:

1
from .p_02_paying_debt_off_in_a_year import compute_balance_after

这里__main____init__,它确切地指的是模块problem_set_02

然后去main.py

埃多克斯1〔22〕

您还可以编写一个setup.py来将特定模块添加到环境中。


尝试将其运行为:

埃多克斯1〔24〕


您好,请按照以下步骤操作,您将解决此问题。如果您已经创建了目录和子目录,那么按照下面的步骤操作,请记住所有目录都必须有"in it.py"才能将其识别为目录。

  • "import sys"并运行"sys.path",您将能够看到python正在搜索的所有路径。您必须能够看到当前的工作目录。

  • 现在,使用import导入子目录和要使用的各个模块,请执行以下命令:"import subdir.subdir.modulename as abc",现在可以使用该模块中的方法。屏幕截图或照片问题

  • 正如您在这个屏幕截图中看到的,我有一个父目录和两个子目录,在第二个子目录下,我有module==commonfunction在执行sys.path之后,您会看到右边,我可以看到我的工作目录。