Python中使用pyinstaller打包exe文件后提示“不是有效的win32应用程序”如何解决?

想把 hello.py 变成 exe 文件,结果在 winXP 32 位系统下总失败,

warnhello.txt 的内容是:

missing module named resource - imported by posix, D:\我的文档\Downloads\pyinstaller-pyinstaller-v3.3-12-g133d181\pyinstaller-pyinstaller-133d181\hello.py
missing module named posix - imported by os, D:\我的文档\Downloads\pyinstaller-pyinstaller-v3.3-12-g133d181\pyinstaller-pyinstaller-133d181\hello.py
missing module named _posixsubprocess - imported by subprocess, D:\我的文档\Downloads\pyinstaller-pyinstaller-v3.3-12-g133d181\pyinstaller-pyinstaller-133d181\hello.py
missing module named ‘org.python’ - imported by pickle, D:\我的文档\Downloads\pyinstaller-pyinstaller-v3.3-12-g133d181\pyinstaller-pyinstaller-133d181\hello.py, xml.sax
missing module named ce - imported by os, D:\我的文档\Downloads\pyinstaller-pyinstaller-v3.3-12-g133d181\pyinstaller-pyinstaller-133d181\hello.py
missing module named readline - imported by cmd, code, pdb, D:\我的文档\Downloads\pyinstaller-pyinstaller-v3.3-12-g133d181\pyinstaller-pyinstaller-133d181\hello.py
excluded module named _frozen_importlib - imported by importlib, D:\我的文档\Downloads\pyinstaller-pyinstaller-v3.3-12-g133d181\pyinstaller-pyinstaller-133d181\hello.py
missing module named _scproxy - imported by urllib.request
missing module named java - imported by platform, D:\我的文档\Downloads\pyinstaller-pyinstaller-v3.3-12-g133d181\pyinstaller-pyinstaller-133d181\hello.py
missing module named ‘java.lang’ - imported by platform, D:\我的文档\Downloads\pyinstaller-pyinstaller-v3.3-12-g133d181\pyinstaller-pyinstaller-133d181\hello.py, xml.sax._exceptions
missing module named vms_lib - imported by platform, D:\我的文档\Downloads\pyinstaller-pyinstaller-v3.3-12-g133d181\pyinstaller-pyinstaller-133d181\hello.py
missing module named termios - imported by tty, D:\我的文档\Downloads\pyinstaller-pyinstaller-v3.3-12-g133d181\pyinstaller-pyinstaller-133d181\hello.py, getpass
missing module named _dummy_threading - imported by dummy_threading, D:\我的文档\Downloads\pyinstaller-pyinstaller-v3.3-12-g133d181\pyinstaller-pyinstaller-133d181\hello.py
missing module named grp - imported by tarfile, shutil, D:\我的文档\Downloads\pyinstaller-pyinstaller-v3.3-12-g133d181\pyinstaller-pyinstaller-133d181\hello.py
missing module named pwd - imported by posixpath, tarfile, shutil, http.server, webbrowser, D:\我的文档\Downloads\pyinstaller-pyinstaller-v3.3-12-g133d181\pyinstaller-pyinstaller-133d181\hello.py, getpass
missing module named org - imported by copy, D:\我的文档\Downloads\pyinstaller-pyinstaller-v3.3-12-g133d181\pyinstaller-pyinstaller-133d181\hello.py
Python中使用pyinstaller打包exe文件后提示“不是有效的win32应用程序”如何解决?


9 回复

这个问题通常是因为打包环境(Python解释器、库)的位数(32位/64位)与运行环境不匹配,或者打包过程本身出了问题。

最直接的解决方案是在64位系统上使用64位Python环境重新打包。以下是完整的步骤和代码示例,确保生成一个兼容的exe文件:

  1. 首先,检查并清理环境
# 卸载可能出问题的包
pip uninstall pyinstaller -y
pip uninstall pywin32 -y

# 清理缓存
pip cache purge
  1. 创建干净的打包脚本(比如叫build.py):
import PyInstaller.__main__
import os
import sys

# 获取当前脚本所在目录
script_dir = os.path.dirname(os.path.abspath(__file__))

# 你的主程序文件
main_script = os.path.join(script_dir, 'your_main_script.py')

# PyInstaller配置参数
args = [
    main_script,
    '--onefile',           # 打包成单个exe
    '--clean',             # 清理临时文件
    '--noconfirm',         # 覆盖输出目录不提示
    '--name=MyApp',        # 生成的exe名称
    '--icon=app.ico',      # 可选:图标文件
    '--add-data=config.ini;.',  # 可选:添加数据文件
    '--hidden-import=some_module',  # 可选:隐藏导入的模块
]

# 如果是GUI程序,添加--windowed
# args.append('--windowed')

# 执行打包
PyInstaller.__main__.run(args)
  1. 在命令行中执行
# 确保使用正确的Python(64位)
python --version  # 应该显示64位

# 安装64位版本的包
pip install pyinstaller
pip install pywin32

# 运行打包脚本
python build.py

如果问题依旧,尝试这些变通方案:

方案A:指定Python解释器路径

# 在build.py中添加
args.extend([
    '--python-option', 'python38.dll',  # 指定Python DLL
])

方案B:使用虚拟环境确保纯净

# 创建虚拟环境
python -m venv venv_64bit

# 激活(Windows)
venv_64bit\Scripts\activate

# 安装必要包
pip install pyinstaller
pip install your_dependencies

# 然后重新打包

方案C:如果必须支持32位系统

# 在64位系统上安装32位Python
# 然后使用32位Python重复上述步骤

检查生成的exe是否有效:

# 验证exe文件
import pefile
pe = pefile.PE('dist/MyApp.exe')
print(f"Machine: {pe.FILE_HEADER.Machine}")  # 0x8664是64位,0x14c是32位

总结:确保Python环境、PyInstaller和系统位数一致。

可以检查有没有安装相关的 VC++运行库

用命令:dumpbin /header hello.exe
如果结果显示 operation system version 是 6.0, 这是表示此 pe 文件不兼容 xp,参考 https://msdn.microsoft.com/en-us/library/windows/desktop/ms724832(v=vs.85).aspx, 你可以重新编译 pyinstaller 的 bootloader。

你的 python 版本是 x64 的吧,换成 x86 的

哦对了,还有一点,xp 最高支持 python3.4,所以说你生成 exe 的电脑上的 python 版本必须要小于 3.4


用 cx_Freeze 方法可行

安装 win sdk 后仍报同样的错。

用 dumpbin 命令后,提示“‘dumpbin’ 不是内部或外部命令,也不是可运行的程序”,按网上的办法找到 VCVARS32.BAT 在命令行中运行时又报错“ ERROR: Cannot determine the location of the VS Common Tools folder.”试了改 VCVARS32.BAT 内容的办法无用后便未继续弄,换别的方法了。

python 版本:Python 3.4.0 (v3.4.0:04f714765c13, Mar 16 2014, 19:24:06) [MSC v.1600 32 bit (Intel)] on win32

dumpbin 要安装了 VS 之后才有。其实 exescope 之类的任何 PE 文件 explorer 都是可以显示这个信息的。

这个问题之前遇见过,应该就是 Operation system version 的问题,你可以直接重新编译 pyinstaller 的 bootloader 解决。


我按照 http://pythonhosted.org/PyInstaller/bootloader-building.html 编译 pyinstaller 的 bootloader 时报错:
File “./waf”, line 3
Thomas Nagy , 2005-2016
^
SyntaxError: invalid syntax
查了下好像是我现在用的 python 版本(Python 3.4.0)的问题,已找到转 exe 的办法了,不继续试 pyInstaller 了,谢谢帮助

回到顶部