Python跨py文件导入read_files报ImportError问题咨询
报错产生原因
核心问题有2个:
- 模块搜索路径配置错误
Python导入xxx.yyy格式的包/模块时,会遍历sys.path列表中的所有目录,查找是否存在名为xxx的文件夹(且文件夹内包含__init__.py文件才会被识别为Python包)。你当前把/Users/Documents/python/test/setup目录本身追加到了sys.path里,进入该目录后只能看到mapsetup.py、__init__.py两个文件,根本不存在名为setup的子文件夹,因此Python无法在你追加的路径下找到setup.mapsetup模块,会转而搜索其他环境路径下同名的setup.mapsetup模块,而该模块内没有定义read_files函数,就会触发你看到的导入错误。 - 代码存在潜在运行BUG
你的mapsetup.py中调用了os.path.join方法,但没有在文件开头导入os模块,就算导入问题解决,调用函数时也会触发NameError;另外函数内使用的dir字典没有提前定义、函数没有返回值,后续运行也会报错。
正确修改方案
按照以下步骤调整即可正常导入:
- 修正
sys.path追加的路径
不要追加setup文件夹的路径,改为追加setup包的父目录——也就是test文件夹的路径。推荐用动态路径写法,避免写死绝对路径导致项目迁移后失效,在plot.py中添加如下路径配置代码:
import os import sys # 获取当前plot.py所在的test文件夹绝对路径 current_project_dir = os.path.dirname(os.path.abspath(__file__)) sys.path.append(current_project_dir)
配置完成后,Python就能在sys.path中找到setup包,正常识别setup.mapsetup模块路径。
2. 补全mapsetup.py的缺失内容
在mapsetup.py最开头补全os模块导入,同时补全缺失的变量定义、返回值:
import os # 提前定义dir字典,替换为你实际的目录配置 dir = {"extents_dir": "实际存储extent文件的根目录路径"} def read_files(project_name): extent_dir = os.path.join(dir['extents_dir'], project_name, f'extent_{project_name}.shp') return extent_dir
- 保持导入语句不变
路径配置正确后,原来的from setup.mapsetup import read_files语句就可以正常工作,不需要修改。
不推荐的替代写法:如果你坚持要把
setup文件夹路径追加到sys.path,则需要把导入语句改成from mapsetup import read_files,但这种写法破坏了包的层级结构,后续模块多了很容易出现命名冲突,不要在正式项目里使用。
内容的提问来源于stack exchange,提问作者Humzah Qazilbash
相关产品推荐
相关产品推荐

