PyInstaller生成的EXE仅名称为main时可运行,改名后报错如何解决
问题根因说明
正常情况下PyInstaller打包生成的EXE不存在文件名依赖,你遇到的报错本质是业务代码中存在读取当前运行程序文件名的逻辑,且将文件名的部分/全部内容直接传入了bytes.fromhex()方法,当对应内容不符合十六进制字符规则时就触发异常。
你提供的报错信息:
ValueError: non-hexadecimal number found in fromhex() arg at position 17
已经明确指向fromhex()方法的输入参数在第17位存在非十六进制字符,结合只有EXE命名为main时正常、改名就报错的特征,可以定位到fromhex()的入参和当前运行的EXE文件名直接关联。
排查步骤
- 全局搜索项目代码中的
fromhex关键字,找到所有调用该方法的代码行,回溯其传入参数的来源 - 检查代码中是否存在读取当前进程名/运行文件名的逻辑,常见的读取方式包括:
import sys import os # 常见读取当前运行程序文件名的写法 exe_full_path = sys.argv[0] exe_name = os.path.basename(exe_full_path) # 用到psutil库时的进程名读取写法 import psutil current_process_name = psutil.Process().name() - 逻辑验证:当EXE命名为
main时,你代码中截取的文件名对应片段刚好全是合法的十六进制字符,所以fromhex()调用不会报错;当你改为studio时,对应位置出现了非十六进制字符(十六进制仅支持0-9、a-f、A-F),所以直接触发报错。
解决方法
- 确认
fromhex()方法的预期入参来源,如果是误将文件名作为入参,修改逻辑为读取实际需要的十六进制字符串即可,不要关联运行程序的文件名 - 如果确实需要用到文件名做相关校验或运算,先对截取的文件名片段做合法性校验,确认符合十六进制规则后再传入
fromhex()方法,或者提前约定合法的文件名规则,避免非预期的文件名导致报错 - 修复完成后重新用PyInstaller打包,即可任意修改EXE文件名,不会再触发该报错。
内容的提问来源于stack exchange,提问作者Elephie
相关产品推荐
相关产品推荐

