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

时间:2017-01-23 22:40:48

标签: python module python-3.6 python-import

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

enter image description here

我正在尝试使用以下命令从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文件,但它仍无效。

7 个答案:

答案 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"将其识别为目录。

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

  2. 现在使用import导入子目录和要使用的相应模块遵循以下命令:" import subdir.subdir.modulename as abc "现在您可以使用该模块中的方法。 ScreenShotforSameIssue

  3. 你可以在这个截图中看到我有一个父目录和两个子目录,在第二个子目录下我有模块== 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,它自动解决了这个问题