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

Python包跨文件夹导入文件报错,求非sys库解决方案

问题分析与解决

问题背景

项目结构

pythonProject
|
|-__init__.py
|
|- a 
|  |- file_a.py 
|  |-__init__.py
|
|- b 
   |- file_b.py 
   |-__init__.py

相关代码

file_a.py

class class_a:
    def __init__(self):
        pass
    def show(self):
        print('class A')

if __name__ == "__main__":
    pass

file_b.py(初始版本)

from pythonProject.a.file_a import class_a

class class_b:
    def __init__(self):
        pass

    def show(self):
        a = class_a()
        a.show()

if __name__ == "__main__":
    b = class_b()

报错情况

在pythonProject目录下执行python b/file_b.py时,出现No module named 'pythonProject';尝试相对导入、简化导入路径均报错。


错误原因

  1. 直接运行子脚本的问题:执行python b/file_b.py时,Python会把b/目录当成脚本的运行根目录,pythonProject不会被识别为一个包,自然找不到pythonProject或a这些模块。
  2. 相对导入的限制:相对导入from ..a...只在模块被作为包的一部分导入时生效,直接运行脚本的话,Python无法识别它的父包结构,所以报错。
  3. 空__init__.py没问题:空的__init__.py已经能标记目录为Python包,不需要添加任何额外内容,这不是问题所在。

解决方法(无需修改sys.path)

方案1:用模块方式运行脚本

在pythonProject目录下执行:

python -m b.file_b

同时把file_b.py的导入语句改成:

from a.file_a import class_a

-m参数会让Python把当前pythonProject目录加入模块搜索路径,a和b作为同级包就能被互相识别。

如果想保留from pythonProject.a.file_a import class_a的导入语句,需要到pythonProject的父目录下执行:

python -m pythonProject.b.file_b

方案2:新增项目入口文件

在pythonProject目录下创建main.py:

from b.file_b import class_b

if __name__ == "__main__":
    b = class_b()
    b.show()

把file_b.py的导入语句改成from a.file_a import class_a,然后在pythonProject目录下执行:

python main.py

这种方式把入口放在项目根目录,Python会自动把根目录加入搜索路径,子包之间的导入就能正常工作。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 14:17:32