Python相对导入含文件依赖的模块,如何无需手动切换目录?
无需手动切换目录实现Python类导入与依赖文件读取
问题场景
我有一个Python脚本,需要从相对路径导入myClass类。myClass.py同目录下有个CSV文件,实例化myClass时会读取这个文件生成DataFrame。目前我只能靠手动切换工作目录来实现:
currentPath = os.getcwd() sys.path.append("../../../ClassFolder/") # 相对文件夹路径 os.chdir(libPath) from myScript import myClass myObj = myClass() os.chdir(currentPath)
想知道有没有不用手动切目录的办法?
解决办法
1. 让myClass自己搞定文件路径(最推荐)
问题根源是myClass读取CSV时依赖当前工作目录,把这个逻辑改了就一劳永逸。在myClass.py里这么写:
import pandas as pd import os class myClass: def __init__(self): # 获取当前myClass.py文件的绝对路径所在目录 script_dir = os.path.dirname(os.path.abspath(__file__)) # 拼接同目录下的CSV文件路径 csv_full_path = os.path.join(script_dir, "你的CSV文件名.csv") self.df = pd.read_csv(csv_full_path)
不管主脚本在哪个目录运行,myClass都会从自己所在的目录找CSV,完全不用管工作目录的问题。
2. 给sys.path加绝对路径,直接导入
如果不想改myClass的代码,可以在主脚本里算出ClassFolder的绝对路径,加到sys.path后直接导入,不用切目录:
import os import sys # 基于当前主脚本的路径,算出ClassFolder的绝对路径 current_script_dir = os.path.dirname(os.path.abspath(__file__)) class_folder_abs = os.path.abspath(os.path.join(current_script_dir, "../../../ClassFolder/")) sys.path.append(class_folder_abs) from myScript import myClass myObj = myClass()
⚠️ 注意:如果不修改myClass的CSV读取逻辑,它还是会从主脚本的工作目录找文件,所以这个方法只能解决导入问题,文件读取的问题还是得靠方法1解决。
3. 用importlib动态加载模块(复杂路径适用)
如果路径结构比较特殊,不想加sys.path,可以用importlib直接加载指定文件:
import os import importlib.util current_script_dir = os.path.dirname(os.path.abspath(__file__)) # 直接算出myScript.py的绝对路径 my_script_path = os.path.abspath(os.path.join(current_script_dir, "../../../ClassFolder/myScript.py")) # 动态加载模块 spec = importlib.util.spec_from_file_location("myScript", my_script_path) myScript = importlib.util.module_from_spec(spec) spec.loader.exec_module(myScript) # 实例化类 myObj = myScript.myClass()
同样,配合方法1修改myClass的CSV读取路径,就能彻底解决问题。
内容的提问来源于stack exchange,提问作者dba
相关产品推荐
相关产品推荐

