Python开机启动应用文件加载路径异常求助(cx_freeze打包)
Windows开机启动程序的文件加载问题解决方案
问题核心
开机启动时,os.getcwd()返回的是启动触发路径(如快捷方式所在的启动文件夹、注册表默认的系统目录),而非程序实际所在目录,导致无法读取同目录下的file.json。以下是通用解决方案:
方案1:通过程序自身路径推导配置文件位置(推荐)
不管用哪种开机启动方式,直接获取程序exe的绝对路径,再拼接配置文件路径,这是最可靠的通用方法,兼容开发环境和打包后的程序。
import os import sys def get_app_dir(): # 判断是否是cx_freeze打包后的程序 if getattr(sys, 'frozen', False): # 打包后,sys.executable指向exe文件路径 return os.path.dirname(sys.executable) else: # 开发环境,__file__是当前脚本路径 return os.path.dirname(os.path.abspath(__file__)) # 拼接file.json的绝对路径 file_path = os.path.join(get_app_dir(), 'file.json') # 读取文件 with open(file_path, 'r', encoding='utf-8') as f: content = f.read()
方案2:修改开机启动项的工作目录
针对不同的开机启动方式,分别设置工作目录为程序所在路径:
2.1 创建快捷方式时指定工作目录
用win32com.client创建快捷方式时,设置WorkingDirectory属性为程序所在目录:
import win32com.client import os import sys if getattr(sys, 'frozen', False): app_path = sys.executable else: app_path = os.path.abspath(__file__) app_dir = os.path.dirname(app_path) # 获取Windows启动文件夹路径 startup_folder = os.path.join(os.environ['APPDATA'], r'Microsoft\Windows\Start Menu\Programs\Startup') shortcut_path = os.path.join(startup_folder, 'MyApp.lnk') # 创建快捷方式 shell = win32com.client.Dispatch("WScript.Shell") shortcut = shell.CreateShortCut(shortcut_path) shortcut.TargetPath = app_path # 设置工作目录为程序所在目录 shortcut.WorkingDirectory = app_dir shortcut.Save()
2.2 注册表启动项补充说明
Windows注册表的Run项本身不支持直接设置工作目录,因此更推荐使用方案1。如果坚持用注册表,可通过批处理中转:创建一个批处理文件,先切换到程序目录再启动exe,然后把注册表启动项指向这个批处理。
批处理内容(保存为start_app.bat,放在程序同目录):
@echo off cd /d "%~dp0" start "" "app.exe"
然后注册表中设置启动项为该批处理的绝对路径。
内容的提问来源于stack exchange,提问作者MooNChilD Song
相关产品推荐
相关产品推荐

