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

lmi*_*asf 161 python module python-import python-3.6

我试图从控制台运行一个模块.我的目录结构是这样的:

在此输入图像描述

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

$ python3 p_03_using_bisection_search.py
Run Code Online (Sandbox Code Playgroud)

里面的代码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()
Run Code Online (Sandbox Code Playgroud)

我正在导入一个函数,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()
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

ModuleNotFoundError: No module named '__main__.p_02_paying_debt_off_in_a_year'; '__main__' is not a package
Run Code Online (Sandbox Code Playgroud)

我不知道如何解决这个问题.我试过添加一个__init__.py文件,但它仍然无法正常工作.

Mos*_*oye 179

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

from p_02_paying_debt_off_in_a_year import compute_balance_after
Run Code Online (Sandbox Code Playgroud)

  • 你解决了 为什么即使添加`__init __.py`,相对导入也不起作用? (40认同)
  • 使用 Python 的导入是令人恼火的。就像 Python 3、PyCharm 和 MyPy 都在嘲笑我们。为什么“from ..sibling_pkg.nephew import my_function”对 PyCharm 有效,但会导致“ValueError:尝试相对导入超出顶级包”和 MyPy“找不到名为 '.sibling_pkg.nephew' 的模块”(注意错误中只有一个“.”,而不是两个)。然而,“fromsibling_pkg.nephew import my_function”按预期工作,没有 MyPy 错误,但确实导致 PyCharm 错误。 (34认同)
  • @djvg-要修复PyCharm,您可以将根目录标记为源根 (16认同)
  • 接受的答案对我不起作用.您是否可以通过添加简约示例设置来扩展答案? (14认同)
  • 这适用于我(在一个包内,即在同一个文件夹中有一个空的`__init __.py`),虽然我的PyCharm(2018.2.4)将其标记为"未解析的引用"并且无法自动完成导入. (7认同)
  • 扩展 @DenisYakovlev 的评论:要将目录标记为 PyCharm 中的源根,只需右键单击“将目录标记为”、“源根”。 (5认同)
  • 我通过不将主脚本命名为与其父目录相同的名称来修复此错误。我的主脚本“app.py”位于“app”文件夹中,即“app/app.py”。它包含行“import app.lib”,旨在导入模块“app/lib.py”。引发`ModuleNotFoundError:没有名为“app.lib”的模块;“app”不是一个包`。通过将“app/app.py”重命名为“app/blabla.py”来修复。 (2认同)

小智 70

我和你一样有同样的问题.我认为问题是你使用了相对导入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,脚本等于:

main.py

显然,setup.py不包含任何调用的模块或实例problem_set_02/.

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


所以我提出了一个更清晰的解决方案,而没有更改python环境的贵重物品(在查询请求在相对导入中的工作方式)之后:

该目录的主要架构是:

__init__.py

p01.py

---p02.py

------p03.py

------__init__.py

------__main__

------__init__

然后写下problem_set_02:

from .p_02_paying_debt_off_in_a_year import compute_balance_after
Run Code Online (Sandbox Code Playgroud)

main.pyimport problem_set_02,它正是指模块setup.py.

然后去in-package import:

__init__.py

您还可以编写一个__main__以向环境添加特定模块.


Dan*_*der 13

尝试将其运行为:

python3 -m p_03_using_bisection_search


小智 6

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

from problem_set_02.p_02_paying_debt_off_in_a_year import compute_balance_after
Run Code Online (Sandbox Code Playgroud)


Ami*_*ini 5

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

from __future__ import absolute_import

from p_02_paying_debt_off_in_a_year import compute_balance_after
Run Code Online (Sandbox Code Playgroud)