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


207

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

在此处输入图片说明

我正在尝试使用以下命令p_03_using_bisection_search.pyproblem_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文件,但是仍然无法正常工作。


3
不是您的问题,但是我只是想把它扔出去:eval(input...可能不是一个好主意。我只是解析它,而不是为任意代码执行提供机会。
Carcigenicate

2
我敢打赌这eval(input(...是2to3建议的。我今天要对我这样做。很高兴我没有遵循它的建议,使人感到盲目
ckot

Answers:


237

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

from p_02_paying_debt_off_in_a_year import compute_balance_after

56
你解决了。为什么即使我添加,相对导入也不起作用__init__.py
lmiguelvargasf

23
接受的答案对我不起作用。您是否可以通过添加一个简约的示例设置来扩展答案?
Pranasas

13
__init__.py尽管我的PyCharm(2018.2.4)将其标记为“无法解析的引用”,并且无法自动完成导入,但是这对我有用(在包中,即在同一文件夹中为空)。
djvg

33
@djvg-要修复PyCharm,您可以将根目录标记为源根
Denis Yakovlev

12
使用Python的导入很令人生气。就像Python 3,PyCharm和MyPy都在为我们付出的代价而大笑。它如何from ..sibling_pkg.nephew import my_function对PyCharm有效,但导致ValueError: attempted relative import beyond top-level package和MyPy Cannot find module named '.sibling_pkg.nephew'(注意错误中的单个“。”,而不是两个)。但是,from sibling_pkg.nephew import my_function按预期方式运行,没有MyPy错误,但会导致PyCharm错误。
ubiquibacon,

85

我和你有同样的问题。我认为问题是您在中使用了相对导入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

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



2

您好,请按照以下步骤操作,您将解决此问题。如果已创建目录和子目录,请按照以下步骤操作,请记住,所有目录必须必须 __init__.py将其识别为目录。

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

  2. 现在,按照以下命令导入要使用import使用的子目录和相应模块:import subdir.subdir.modulename as abc现在,您可以使用该模块中的方法。 屏幕截图相同的问题

如您在此屏幕快照中看到的,我有一个父目录和两个子目录,在第二个子目录下,我有module == CommonFunction,执行sys.path后您会看到右侧,我可以看到我的工作目录



1

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

from problem_set_02.p_02_paying_debt_off_in_a_year import compute_balance_after
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.