如何通过路径导入Python文件并动态加载最新版本代码,兼容多系统
解决方案
原代码核心问题
- 插入
sys.path的路径仅传入了版本文件夹名称,未拼接上层Versions目录,Python解释器无法定位对应路径下的main.py - 硬编码路径分隔符
/,跨Windows/Linux系统时会出现路径识别错误 - 未做绝对路径适配,若从非
ClockOS目录下启动bootLoader.py,会找不到Versions目录 - 代码行
os.path.dirname('Versions/'+str(latest))没有接收返回值,无实际作用
修复后代码
import os import re import sys # 取bootLoader.py所在的根目录,避免工作目录变化导致路径失效 BASE_DIR = os.path.dirname(os.path.abspath(__file__)) VERSIONS_DIR = os.path.join(BASE_DIR, 'Versions') versionList = [] for filename in os.listdir(VERSIONS_DIR): if filename.startswith('Version'): versionList.append(filename) print(f"Loaded {filename}") def major_minor_micro(version): major, minor, micro = re.search(r'(\d+)\.(\d+)\.(\d+)', version).groups() return int(major), int(minor), int(micro) latest = max(versionList, key=major_minor_micro) print("Newest Version: ", latest) # 拼接跨平台兼容的最新版本目录完整路径 latest_dir = os.path.join(VERSIONS_DIR, latest) # 插入到sys.path最前,优先匹配该路径下的模块,避免重名冲突 sys.path.insert(0, latest_dir) # 导入最新版本的main模块 import main # 如果需要执行main.py中被if __name__ == "__main__"包裹的逻辑,可添加以下代码: # if __name__ == "__main__": # import importlib # importlib.reload(main)
适配说明
该方案所有路径拼接均使用os.path.join处理,原生兼容Windows和Linux系统;Python 3.3及以上版本不需要额外添加__init__.py文件即可正常导入,若需兼容Python 2.x,在每个Version x.x.x目录下新增空__init__.py文件即可。
内容的提问来源于stack exchange,提问作者EnderPrince
相关产品推荐
相关产品推荐

