ModuleNotFoundError: What does it mean __main__ is not a package?
ModuleNotFoundError: What does it mean __main__ is not a package?
我正在尝试从控制台 运行 一个模块。我的目录结构是这样的:
我正在尝试从 problem_set_02
目录 运行 模块 p_03_using_bisection_search.py
,使用:
$ 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
文件,但它仍然无法正常工作。
简单地删除相对导入的点并执行:
from p_02_paying_debt_off_in_a_year import compute_balance_after
我遇到了和你一样的问题。我认为问题在于您在 in-package import
中使用了相对导入。您的目录中没有 __init__.py
。因此,只需按照 Moses 上面的回答进行导入即可。
我认为核心问题是当你用点导入时:
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
来添加特定的模块到环境中。
如果您已创建目录和子目录,请按照以下步骤操作,请记住所有目录必须 __init__.py
才能被识别为目录。
在您的脚本中,包括 import sys
和 sys.path
,您将能够看到 Python 的所有可用路径。您必须能够看到您当前的工作目录。
现在导入您要使用的子目录和相应模块:import subdir.subdir.modulename as abc
现在您可以使用该模块中的方法。
例如,您可以在这张截图中看到我有一个父目录和两个子目录,在第二个子目录下我有模块 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
我正在尝试从控制台 运行 一个模块。我的目录结构是这样的:
我正在尝试从 problem_set_02
目录 运行 模块 p_03_using_bisection_search.py
,使用:
$ 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
文件,但它仍然无法正常工作。
简单地删除相对导入的点并执行:
from p_02_paying_debt_off_in_a_year import compute_balance_after
我遇到了和你一样的问题。我认为问题在于您在 in-package import
中使用了相对导入。您的目录中没有 __init__.py
。因此,只需按照 Moses 上面的回答进行导入即可。
我认为核心问题是当你用点导入时:
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
来添加特定的模块到环境中。
如果您已创建目录和子目录,请按照以下步骤操作,请记住所有目录必须 __init__.py
才能被识别为目录。
在您的脚本中,包括
import sys
和sys.path
,您将能够看到 Python 的所有可用路径。您必须能够看到您当前的工作目录。现在导入您要使用的子目录和相应模块:
import subdir.subdir.modulename as abc
现在您可以使用该模块中的方法。
例如,您可以在这张截图中看到我有一个父目录和两个子目录,在第二个子目录下我有模块 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