Python编写文件读取函数并跨文件调用的方法及路径错误修复方案
这个问题太常见了——本质上是Python解析相对路径的逻辑导致的:Python会从你运行脚本的当前工作目录出发查找文件,而不是从定义函数的脚本所在目录。咱们一步步拆解问题,然后给出最靠谱的解决方案。
问题根源分析
你FolderA里的ConfigHelper.py用了相对路径"Config.json",当从同目录的testA.py调用时,如果你是在FolderA目录下运行testA.py,当前工作目录就是FolderA,自然能找到同目录的Config.json;但从FolderB的Test.py调用时,不管你是在FolderB还是MainFolder下运行脚本,当前工作目录都不是FolderA,所以Python会去错误的位置找Config.json,自然报找不到文件的错误。
解决方案:基于脚本所在目录构建绝对路径
最可靠的方法是让ConfigHelper自己知道Config.json的准确位置——利用Python的__file__属性(它会返回当前模块文件的路径),结合路径处理工具来构建绝对路径。这里有两种实现方式:
方法1:使用os模块(兼容所有Python版本)
修改FolderA里的ConfigHelper.py:
import json import os class ConfigHelper: def read_config(self): # 获取当前脚本(ConfigHelper.py)所在的绝对目录 script_dir = os.path.dirname(os.path.abspath(__file__)) # 拼接Config.json的绝对路径 config_path = os.path.join(script_dir, "Config.json") with open(config_path, "r") as jsonfile: return json.load(jsonfile)
os.path.abspath(__file__):把当前脚本的相对路径转成绝对路径os.path.dirname():提取出脚本所在的目录os.path.join():安全地拼接目录和文件名(自动处理不同系统的路径分隔符,比如Windows的\和Linux的/)
方法2:使用pathlib(Python 3.4+,更简洁直观)
如果你用的是Python3.4及以上,推荐用pathlib,它的面向对象语法更清晰:
import json from pathlib import Path class ConfigHelper: def read_config(self): # 获取当前脚本所在目录的Path对象,resolve()确保是绝对路径 script_dir = Path(__file__).parent.resolve() # 用/拼接路径,和操作系统无关 config_path = script_dir / "Config.json" with open(config_path, "r") as jsonfile: return json.load(jsonfile)
确保跨目录导入正常工作
另外,从FolderB的Test.py调用FolderA的ConfigHelper时,要确保Python能找到FolderA模块。如果直接运行Test.py出现导入错误,可以在Test.py开头加上这段代码,把MainFolder加入Python的模块搜索路径:
import sys from pathlib import Path # 获取MainFolder的绝对路径并加入sys.path main_folder = Path(__file__).parent.parent.resolve() sys.path.append(str(main_folder)) # 现在可以正常导入了 from FolderA.ConfigHelper import ConfigHelper # 调用函数 config_helper = ConfigHelper() config_data = config_helper.read_config() print(config_data)
这样修改后,不管你在哪个目录下运行Test.py,ConfigHelper都能准确找到Config.json的位置。
内容的提问来源于stack exchange,提问作者bhupesh bhatt

