python not is函数___main__ is not a package问题复现以及解决(python相对引用)

本文详细介绍了在Python中遇到模块导入错误`ModuleNotFoundError`的原因及解决方法。问题源于使用了相对引用且被导入模块的`__name__`属性为`__main__`。解决策略是避免直接执行包含相对引用的模块,而应通过一个不含相对引用的`main.py`入口文件来运行程序。此外,还列举了不同类型的导入语法示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、问题复现

文件结构很简单:

|--------package

|    ├── __init__.py

|    ├── base.py

|    └── derived.py

|--------main.py

各个文件内容如下:

#base.py

deftestfun():print('base')

#derived.py

from .base import testfun

testfun()

然后 cd到 derived.py 所在目录,执行  python derived.py

报错:

ModuleNotFoundError: No module named '__main__.base'; '__main__' is not a package

2、问题原因-----使用了相对引用的module的__name__ 属性是 __main__ 的时候,会导致错误

这里使用了相对引用:主要是对于使用了相对引用的python文件,会利用 这个文件的 __name__ 属性 定位相对引用的package。

如果 那个python文件 是 __main__(也就是说不包含任何package信息) ,那么相对引用会被解析成 top level module,而不关注 这个 module 是否存在于文件系统中

此外 如果直接执行  python 文件名.py 的时候,这个文件名.py 对应的module __name__ 值就是  '__main__'

3、解决办法

包含相对引用的 module,不要直接利用  解释器执行,也就是说这个module的 __name__ 属性不要作为 __main__, 可以 加入一个 main.py 文件,作为入口,同时这个main.py 文件不包含相对引用

4、引申一点 关于相对引用的集中情况

################import可以引入一个 module,可以引入一个函数

#Import 同一個 package 底下的 sibling module `moduleY`

[A] from package.subpackage1 importmoduleY

[R]from . importmoduleY

[Error]import.moduleY#從同一個 package 底下的 sibling module `moduleY` 中的函数 spam

[A] from package.subpackage1.moduleY importspam

[R]from .moduleY importspam#從隔壁 package 底下的 module `moduleZ`中的函数 eggs

[A] from package.subpackage2.moduleZ importeggs

[R]from ..subpackage2.moduleZ importeggs#Import parent package 底下的 module `moduleA`

[A] from package importmoduleA

[R]from .. import moduleA 或 from ... package import moduleA

5、参考文献:

https://medium.com/pyladies-taiwan/python-%E7%9A%84-import-%E9%99%B7%E9%98%B1-3538e74f57e3

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值