Python调用exe无法读取同目录JSON文件的解决方案咨询
问题原因
通过Python调用外部exe时,默认工作目录是Python脚本的运行目录,而非exe所在目录。双击exe时系统会自动将工作目录设为exe的路径,所以Consults.exe能正常读取同目录JSON;但用subprocess/os.system调用时,工作目录不对,导致程序找不到JSON文件。你之前修改PATH的思路有误,PATH是用来查找可执行文件的路径,和当前程序读取本地配置文件的路径无关。
解决方案
核心是显式将工作目录设置为exe所在的文件夹,以下是正确的实现方式:
使用subprocess模块(推荐)
subprocess的run和Popen方法都支持cwd参数,直接指定工作目录即可:
path_unzip = 'D:\\Test' path_program = 'Consults.exe' # 同步执行程序 subprocess.run([path_program], cwd=path_unzip) # 异步执行程序 subprocess.Popen([path_program], cwd=path_unzip)
也可以传入exe的完整路径,效果一致:
subprocess.run([f"{path_unzip}\\{path_program}"], cwd=path_unzip)
使用os.system
需要先切换到exe所在目录(Windows下切换盘符要加/d参数),再执行程序:
path_unzip = 'D:\\Test' path_program = 'Consults.exe' # 同步执行 os.system(f'cd /d "{path_unzip}" && "{path_program}"') # 用start打开新窗口异步执行 os.system(f'cd /d "{path_unzip}" && start "" "{path_program}"')
注意start后的空字符串是窗口标题参数,必须明确传入,否则start会把exe路径当成窗口标题,无法正常启动程序。
验证方法
可以在Consults.exe中添加打印当前工作目录的代码,确认调用时的工作目录是否正确。比如如果是Python编写的exe,可加入print(os.getcwd());如果是C#编写的exe,可加入Console.WriteLine(Directory.GetCurrentDirectory())。
内容的提问来源于stack exchange,提问作者J.N.N
相关产品推荐
相关产品推荐

