You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 02:05:12