关于PyInstaller存储Python脚本位置及提取exe中Python代码的技术问询
1. PyInstaller将Python脚本存储在何处?
PyInstaller打包Python脚本的方式分两种,对应的存储位置也不一样:
- 单文件打包(使用
-F/--onefile参数):你的脚本和所有依赖会被压缩后嵌入到生成的.exe文件内部。当你运行这个.exe时,它会自动把这些内容临时解压到系统的临时目录(Windows一般是%TEMP%,Linux/macOS是/tmp),程序运行结束后,临时文件会被自动删除。 - 多文件打包(默认方式,不使用
-F):脚本会被编译成.pyc字节码文件,和依赖的库一起存放在生成的[你的应用名]_dist文件夹里,通常在[你的应用名]_dist/[你的应用名]这个子目录下,你可以直接看到这些.pyc文件。
2. 我使用PyInstaller生成了可执行文件(.exe),希望提取其中存储的Python代码,该如何操作?
首先要明确:PyInstaller打包的是编译后的.pyc字节码文件,不是原始的.py源码,所以我们需要先提取出.pyc,再反编译成可读代码。步骤如下:
第一步:提取.exe中的打包内容
用pyinstxtractor.py这个专门提取PyInstaller打包内容的开源脚本,运行以下命令:
python pyinstxtractor.py your_app.exe
运行后会生成一个名为your_app.exe_extracted的文件夹,里面包含了所有打包进去的文件,你可以找到对应的.pyc文件(主程序的.pyc通常叫__main__.pyc或者和你的脚本同名的.pyc)。
第二步:修复.pyc文件的魔法头
直接提取出的.pyc文件可能缺少Python版本对应的魔法头(一个标识Python版本的十六进制值),没有这个头,反编译工具无法识别。你需要:
- 确定打包该.exe所用的Python版本(比如3.8、3.10),查找对应版本的魔法头(比如Python 3.8的魔法头是
0x550D0D0A)。 - 用十六进制编辑器(比如HxD)将这个魔法头添加到
.pyc文件的最开头。
第三步:反编译.pyc为源码
安装反编译工具,比如uncompyle6(支持多个Python版本):
pip install uncompyle6
然后运行命令反编译修复后的.pyc文件:
uncompyle6 your_fixed.pyc > your_source_code.py
这样就能得到反编译后的Python代码了。
⚠️ 注意:如果打包时使用了--key参数对字节码加密,那么提取和反编译会复杂很多,可能需要额外的解密步骤才能获取代码。
内容的提问来源于stack exchange,提问作者user9463431
相关产品推荐
相关产品推荐

