cx-freeze“ ImportError:DLL加载失败:%1不是有效的Win32应用程序”

时间:2019-12-07 19:19:51

标签: python numpy matplotlib pyqt cx-freeze

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

我安装了带有pip3(所有64位)的PyQt5.5.13.2,并且我确定我安装了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位。这可能是问题吗?

1 个答案:

答案 0 :(得分: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位系统上都能正常工作。