Python已配置__init__.py仍报相对导入无已知父包错误求助
报错原因
这个报错和你写的__init__.py配置无关,你的包结构配置是正确的。触发报错的核心原因是:你直接运行了包内使用相对导入的py文件。
Python的相对导入逻辑依赖包层级上下文:当你在其他代码里导入miner相关模块时,malicious_miner.py属于miner包的一部分,相对导入可以正常找到父包;但当你直接运行python malicious_miner.py时,Python会把这个文件当做顶层主脚本加载,此时它的__name__为__main__、__package__为空,没有对应的父包上下文,自然无法解析.miner这种相对导入路径,就会抛出你看到的错误。
可行解决方案
你可以根据自己的使用场景选下面任意一种方案:
- 方案1:使用模块启动方式运行(最推荐,不需要改代码)
切换到miner文件夹所在的项目根目录(也就是miner文件夹的上一级目录,不要进到miner文件夹内部运行),执行命令:
这种启动方式会把malicious_miner识别为miner包下的模块,保留完整的包上下文,相对导入可以正常工作。python -m miner.malicious_miner - 方案2:给单文件运行加兼容逻辑
如果确实需要直接运行malicious_miner.py单文件,在该文件的最顶部、所有导入语句之前加入如下代码:
加完后不管是直接运行单文件,还是作为模块被其他代码导入,都不会触发导入错误。if __name__ == "__main__" and __package__ is None: import sys from pathlib import Path # 将项目根目录加入Python搜索路径 sys.path.append(str(Path(__file__).parent.parent.resolve())) # 手动指定当前文件所属的包名 __package__ = "miner" - 方案3:替换为绝对导入
把malicious_miner.py里的相对导入语句改成从包根路径开始的绝对导入:
只要运行时的工作目录是miner所在的项目根目录,两种运行方式都能正常执行。# 把原来的 from .miner import Miner 改成 from miner.miner import Miner
内容的提问来源于stack exchange,提问作者MKM
相关产品推荐
相关产品推荐

