Python多层文件导入异常:运行app.py时无法找到call1/call2模块
解决从app.py导入resource.py时找不到call1/call2的问题
这是个很常见的Python模块导入问题,先理清楚你的场景:
你的文件结构是这样的:
home/user/ ├── app.py └── content/ ├── resource.py ├── call1.py └── call2.py
- 你在
app.py里用import content.resource导入resource模块 resource.py里直接用import call1和import call2导入同目录文件- 单独跑
resource.py一切正常,但运行app.py时就会提示找不到call1和call2
问题根源
Python的模块搜索路径(sys.path)是跟着入口脚本的运行目录走的:
- 单独运行
resource.py时,搜索路径是home/user/content/,所以能找到同目录的call1、call2 - 运行
app.py时,搜索路径是home/user/,Python会在这个目录下找call1、call2,自然找不到
下面给你几个可行的解决方案:
方案1:使用相对导入(推荐)
修改resource.py里的导入语句,用相对路径指向同目录的模块:
from . import call1 from . import call2
这个方法是Python包内模块导入的标准做法,但要注意:
- 单独运行
resource.py时,不能直接执行python content/resource.py,要在home/user/目录下执行python -m content.resource(以包模块的方式运行),否则会报相对导入的错误
方案2:手动添加搜索路径
在resource.py的最开头添加代码,把当前文件所在目录加入Python的搜索路径:
import sys import os # 获取当前文件所在的目录路径 current_dir = os.path.dirname(os.path.abspath(__file__)) # 添加到搜索路径 sys.path.append(current_dir) import call1 import call2
这样不管从哪里导入resource.py,Python都能找到content/目录下的call1和call2,单独运行resource.py也不受影响。
方案3:使用绝对导入
把resource.py里的导入改成基于项目根目录的绝对路径:
import content.call1 import content.call2
运行app.py时,Python会从home/user/(根目录)找到content包下的模块;单独运行resource.py时,需要确保home/user/在sys.path里——最简单的方式就是在home/user/目录下执行python content/resource.py,或者把home/user/添加到系统的PYTHONPATH环境变量中。
内容的提问来源于stack exchange,提问作者Mani
相关产品推荐
相关产品推荐

