目录结构和内容
# 1 联系至上方思维导图的 tModule包 下的脚本
from .. import quick_sort
list_before=[2,4,9,3,4,5,2,1,5,6,4,2,7,8,6,0]
quick_sort.quickSort2(list_before)
# 报错:ValueError: attempted relative import beyond top-level package
# 2
from .funconfig import f2 # 从当前目录查找funconfig,404 not found
f2()
# 即使是相同包内 通过相对导入 还是报如下的错
# 报错信息:ModuleNotFoundError: No module named '__main__.config'; '__main__' is not a package
# 因为相对导入没有指定具体的报名,解释器将其默认设置为__main__
# 3
from test.tModule.funconfig import f2 # 绝对路径导入,成功运行
f2() # funconfig.py
#4
# 右击tModule --> make directory as source root
from funconfig import f2 # 解释器在执行时自动从source root 开始查找
f2() # funconfig.py
原文地址:
https://stackoverflow.com/questions/41816973/modulenotfounderror-what-does-it-mean-main-is-not-a-package/41817024#41817024
我认为核心问题是当您使用 点导入时,例如:
from .funconfig import f2。
它相当于:
from __main__.funconfig import f2。
我们都知道,这__main__是指您当前的模块1.py(正是从此文件导入 f2 ,__name__ 为 __main__ )。
问题出现了:
当解释器进入时1.py,脚本等于:
from 1.funconfig import f2
显然,1.py 不包含任何名为f2 的模块或实例。
简而言之,解释器不知道您的目录体系结构。
所以我提出了一个更清晰的解决方案,而没有更改python环境变量(在查询 导入请求 在相对导入中的工作方式之后):
该目录的主要架构是:
main.py
setup.py
---problem_set_02/
------__init__.py
------p01.py
------p02.py
------p03.py
然后写下__init__.py:
from .p_02 import f2(p_92中的函数)
这__main__是__init__,它正是指模块problem_set_02。
然后去main.py:
import problem_set_02
运行main.py,即可看到成果f2中的执行结果
您还可以编写一个setup.py以向环境添加特定模块。
ValueError: attempted relative import beyond top-level package