cx-freeze "ImportError: DLL load failed: %1 is not a valid Win32 application"
cx-freeze "ImportError: DLL load failed: %1 is not a valid Win32 application"
我在安装一个用 cx-freeze 冻结的 python/pyqt/matplotlib 应用程序后出现错误。
我使用
构建应用程序
python setup.py build
setup.py是这个
from cx_Freeze import setup, Executable
buildOptions = dict(packages = [], excludes = [])
import sys
base = 'Win32GUI' if sys.platform=='win32' else None
executables = [
Executable('SectionPropertyCalculator.py', base=base)
]
setup(name='Mecanica-SectionPropertyCalculator',
version = '0.1',
description = 'SPC is a GUI to calculate geometrical properties of beam profiles.',
options = dict(build_exe = buildOptions),
executables = executables)
我明白了
Mecanica-SectionPropertyCalculator-0.1-amd64.exe
.exe 运行在我的开发机器上正常
然后我用
创建一个 msi 安装程序
cx-freeze app bdist_msi
我明白了
Mecanica-SectionPropertyCalculator-0.1-amd64.msi
我将它安装到另一台具有相同 OS、i5 处理器等的机器上,但出现错误
File "C:\...SpcPlotQt.py", line 4 in <module>
ImportError: DLL load failed: %1 is not a valid Win32 application
现在,SpcPlotQt.py 是我的代码,在第 4 行我有
from PyQt5.QtWidgets import QDialog, QApplication
我安装了 PyQt5.5.13.2 和 pip3(所有 64 位),我很确定我安装了 python 3.7 x64,我通过
确认
import struct; print( 8 * struct.calcsize("P"))
64
此外,如果我 运行
import sys; print("%x" % sys.maxsize, sys.maxsize > 2**32)
True
和
import ctypes; print (ctypes.sizeof(ctypes.c_voidp))
8
和
import platform; platform.architecture()[0]
64bit
和
import os; os.environ["PROCESSOR_ARCHITECTURE"]
AMD64
上面的所有 5 个测试表明一切都是 64 位的。
但是当我 运行
import sys; print (sys.platform)
win32
为什么?
AND... cx-freeze 脚本使用 sys.platform 来决定使用什么基础,因此它选择
base=Win32GUI
我该怎么办?
我注意到 python setup.py build
运行s 在 cmd shell 之外,无论我如何打开它,它总是 32 位;即使是 PowerShell 也是 32 位的。这可能是问题所在吗?
在 90% 的情况下,此错误是 64 位和 32 位混合使用的结果。假设你在这里的所有测试都是准确的,我猜你正在使用的开发机器有 64 位的一切,但另一台 windows 机器要么有一个为 32 位设计的 DLL,要么 windows系统本身是32位安装(即使机器本身是64位)。
不用担心 sys.platform
返回 win32
,这就是它的作用。
在两台机器上尝试基本操作:在文件资源管理器中右键单击 computer
,然后单击 properties
- 查看 windows 的安装是 32 位还是 64 位。如果另一台机器是 32 位的,那么你的 exe 与它不兼容,除非你愿意更改 OS.
另一种解决方案:在您的开发机器上安装 python 32 位版本,用它制作 exe 文件几乎可以保证它可以在 32 位和 64 位系统上运行。
我在安装一个用 cx-freeze 冻结的 python/pyqt/matplotlib 应用程序后出现错误。 我使用
构建应用程序python setup.py build
setup.py是这个
from cx_Freeze import setup, Executable
buildOptions = dict(packages = [], excludes = [])
import sys
base = 'Win32GUI' if sys.platform=='win32' else None
executables = [
Executable('SectionPropertyCalculator.py', base=base)
]
setup(name='Mecanica-SectionPropertyCalculator',
version = '0.1',
description = 'SPC is a GUI to calculate geometrical properties of beam profiles.',
options = dict(build_exe = buildOptions),
executables = executables)
我明白了
Mecanica-SectionPropertyCalculator-0.1-amd64.exe
.exe 运行在我的开发机器上正常
然后我用
创建一个 msi 安装程序cx-freeze app bdist_msi
我明白了
Mecanica-SectionPropertyCalculator-0.1-amd64.msi
我将它安装到另一台具有相同 OS、i5 处理器等的机器上,但出现错误
File "C:\...SpcPlotQt.py", line 4 in <module>
ImportError: DLL load failed: %1 is not a valid Win32 application
现在,SpcPlotQt.py 是我的代码,在第 4 行我有
from PyQt5.QtWidgets import QDialog, QApplication
我安装了 PyQt5.5.13.2 和 pip3(所有 64 位),我很确定我安装了 python 3.7 x64,我通过
确认import struct; print( 8 * struct.calcsize("P"))
64
此外,如果我 运行
import sys; print("%x" % sys.maxsize, sys.maxsize > 2**32)
True
和
import ctypes; print (ctypes.sizeof(ctypes.c_voidp))
8
和
import platform; platform.architecture()[0]
64bit
和
import os; os.environ["PROCESSOR_ARCHITECTURE"]
AMD64
上面的所有 5 个测试表明一切都是 64 位的。
但是当我 运行
import sys; print (sys.platform)
win32
为什么?
AND... cx-freeze 脚本使用 sys.platform 来决定使用什么基础,因此它选择
base=Win32GUI
我该怎么办?
我注意到 python setup.py build
运行s 在 cmd shell 之外,无论我如何打开它,它总是 32 位;即使是 PowerShell 也是 32 位的。这可能是问题所在吗?
在 90% 的情况下,此错误是 64 位和 32 位混合使用的结果。假设你在这里的所有测试都是准确的,我猜你正在使用的开发机器有 64 位的一切,但另一台 windows 机器要么有一个为 32 位设计的 DLL,要么 windows系统本身是32位安装(即使机器本身是64位)。
不用担心 sys.platform
返回 win32
,这就是它的作用。
在两台机器上尝试基本操作:在文件资源管理器中右键单击 computer
,然后单击 properties
- 查看 windows 的安装是 32 位还是 64 位。如果另一台机器是 32 位的,那么你的 exe 与它不兼容,除非你愿意更改 OS.
另一种解决方案:在您的开发机器上安装 python 32 位版本,用它制作 exe 文件几乎可以保证它可以在 32 位和 64 位系统上运行。