You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python3.9同目录模块导入报ImportError: cannot import name问题

问题根因

两个报错本质是同一个问题链导致的:

  1. Python3调整了模块搜索优先级:直接运行脚本时,标准库、系统预装模块的路径搜索顺序高于脚本所在目录。你的RHEL8.5环境的/usr/lib64/python3.9/路径下自带了一个同名a.py模块,写from a import aaa的时候,Python先找到的是系统的这个a文件,里面根本没有你定义的aaa函数,自然报导入失败。
  2. 你改成相对导入from .a import aaa之后又报错,是因为直接执行python b.py时,Python会把b.py当成顶层入口脚本,根本不认为当前目录是一个Python包,相对导入找不到父包上下文就会抛出异常。
  3. 你在Python2.7环境下能跑通,是因为Python2的搜索逻辑是先找当前目录的文件,再找系统模块,不会撞到同名的系统a.py,和有没有__init__.py没关系,是两个大版本导入机制的差异。
解决方案

按省事程度排序,选一个用就行:

  • 改名避冲突(首推,零副作用)
    把你自己写的a.py改成不和系统模块重名的名字,比如mya.py,把b.py里的导入改成from mya import aaa,直接跑python b.py就正常了。这是Python开发的基本规范,自己写的模块不要和标准库、系统已装模块重名,不然早晚会踩这种坑。
  • 手动调整搜索路径
    实在不想改文件名,就在b.py最开头加两行代码,把当前脚本所在目录塞到搜索路径最前面,强制Python优先读本地文件:
    import sys, os
    sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
    from a import aaa
    
    aaa()
    
    这种写法不管你在哪个路径下执行python 路径/b.py都能生效,比硬编码写'./'靠谱。
  • 用模块模式启动,适配相对导入
    保留你现在的__init__.py和相对导入写法,不要直接执行python b.py,退到你放这三个文件的文件夹的上一级目录,跑命令:
    python -m 你的代码文件夹名.b
    
    这种启动方式会让Python把你的代码文件夹识别成正规的包,相对导入能正常工作,也不会优先加载系统的a模块。

内容的提问来源于stack exchange,提问作者vel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 01:27:26