【问题标题】:cx-freeze "ImportError: DLL load failed: %1 is not a valid Win32 application"cx-freeze "ImportError: DLL load failed: %1 is not an valid Win32 application"
【发布时间】:2019-12-07 19:19:51
【问题描述】:

我安装了一个使用 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 

我将它安装到另一台具有相同操作系统、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 用完了一个 cmd shell,它始终是 32 位,无论我如何打开它;甚至 PowerShell 也是 32 位的。这可能是问题吗?

【问题讨论】:

    标签: python numpy matplotlib pyqt cx-freeze


    【解决方案1】:

    在 90% 的情况下,此错误是 64 位和 32 位混合的结果。假设您在这里的所有测试都是准确的,我猜您正在使用的开发机器的所有内容都是 64 位的,但是另一台 Windows 机器要么有一个为 32 位设计的 DLL,要么 Windows 系统本身是 32 位安装(甚至如果机器本身是 64 位的)。

    不用担心sys.platform 会返回win32,它就是这样做的。

    在两台机器上尝试基本操作:右键单击文件资源管理器中的computer,然后单击properties - 查看安装的 Windows 是 32 位还是 64 位。如果另一台机器是 32 位的,那么除非您愿意更改操作系统,否则您的 exe 与它不兼容。

    另一种解决方案:在您的开发机器上安装 python 32 位版本,使用它制作 exe 文件几乎可以保证它可以在 32 位和 64 位系统上运行。

    【讨论】:

    • 我听从了你的建议,安装了 32 位 python,为此创建了一个 venv-32,然后 pip 安装了其他所有东西。现在 .exe 在两台机器上运行,但 bdist_msi 最终失败,就在尝试写入 .msi 文件时。也许我应该开始另一个问题?
    • 您是否尝试使用 32 位版本的 python 制作 exe?
    • 是的,现在它可以工作了,一切都是 32 位的,它会构建 .exe,然后是 .msi,然后我在测试计算机上安装了应用程序!成功!可惜64版本有一个卡顿,但是没找到。
    • 关于sys.platform... cx_freeze 开发者用它来选择base。由于sys.platform 是错误的,所以基数是错误的。也许 cx_freeze 开发人员可以解决这个问题?我们如何报告这个错误?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-03
    • 1970-01-01
    • 2019-02-24
    • 2022-06-17
    • 1970-01-01
    • 2012-01-25
    • 2019-01-17
    相关资源
    最近更新 更多