无循环依赖时Python跨文件导入fileread2模块报错问题求助
问题原因及解决方案
- 第一个问题:相对导入使用场景错误。你使用的
from . import fileread2是Python包内的相对导入语法,仅当当前文件作为Python包的子模块被其他文件导入时才能生效。如果直接把主文件作为入口脚本运行,Python会将该文件识别为__main__顶层模块,不支持相对导入的点语法,因此会默认去系统库路径(报错显示的Thonny插件路径)下搜索对应模块,必然找不到。 - 第二个问题:模块搜索路径不匹配。你改用
import fileread2时报错无该模块,说明fileread2.py所在的目录不在Python的模块搜索路径sys.path中,大概率是两种情况:- fileread2.py和运行的主文件没有存放在同一个文件夹下
- 运行主文件时的工作目录不是两个文件所在的目录
- 额外注意:你原有主文件中直接调用
filereader()的写法错误,就算导入成功也会报错,该函数属于fileread2模块,需要加模块前缀调用。
方案1:调整导入方式(最简便,适合同目录场景)
首先确认主文件和fileread2.py放在同一个文件夹下,将主文件代码修改为如下内容即可:
import glob import os import sys # 把当前文件所在目录加入搜索路径,避免工作目录变动导致的搜索失败 sys.path.append(os.path.dirname(os.path.abspath(__file__))) import fileread2 # 加模块名前缀调用函数 dat = fileread2.filereader() print(dat)
方案2:转为Python包结构(适合多模块项目场景)
如果你的项目是多模块组合的项目,可以在两个文件所在的文件夹下新建一个空的__init__.py文件,将文件夹转为Python包,之后不要直接运行主文件,在文件夹的上层目录用-m参数以模块形式运行主文件即可,假设主文件名为main.py、文件所在文件夹名为myproject,运行命令为:python -m myproject.main
此时原有的相对导入语法from . import fileread2可以正常生效。
验证排查方法
如果修改后还是报错,可以在主文件最开头加入以下代码,打印Python的模块搜索路径,确认fileread2.py所在的目录是否在输出的列表中:
import sys print(sys.path)
内容的提问来源于stack exchange,提问作者Eleanor
相关产品推荐
相关产品推荐

