Python cx冻结“;ImportError:DLL加载失败:%1不是有效的Win32应用程序;

Python cx冻结“;ImportError:DLL加载失败:%1不是有效的Win32应用程序;,python,numpy,matplotlib,pyqt,cx-freeze,Python,Numpy,Matplotlib,Pyqt,Cx Freeze,我在安装了一个python/pyqt/matplotlib应用程序后遇到了一个错误,我用cx freeze冻结了该应用程序。 我使用 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

我在安装了一个python/pyqt/matplotlib应用程序后遇到了一个错误,我用cx freeze冻结了该应用程序。 我使用

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 
Mecanica-SectionPropertyCalculator-0.1-amd64.msi 
.exe在我的开发计算机上运行正常

然后我创建了一个msi安装程序

cx-freeze app bdist_msi
我明白了

Mecanica-SectionPropertyCalculator-0.1-amd64.exe 
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
我已经用pip3安装了PyQt5.5.13.2(所有内容都是64位的),我非常确定我已经安装了Python3.7x64,我通过

import struct; print( 8 * struct.calcsize("P"))
64
还有,如果我跑

import sys; print("%x" % sys.maxsize, sys.maxsize > 2**32)
True

以上所有5个测试都表明所有内容都是64位的

但是当我跑的时候

import sys; print (sys.platform)
win32
为什么?

而且。。。cx冻结脚本使用sys.platform来决定使用哪个基,因此它选择

base=Win32GUI
我该怎么办


我注意到
python setup.py build
用完了cmd shell,它总是32位的,无论我如何打开它;即使是PowerShell也是32位的。这可能是问题所在吗

在90%的情况下,此错误是64位和32位混合的结果。假设您在这里的所有测试都是准确的,我猜您正在使用的dev机器的所有东西都是64位的,但是另一台windows机器或者有一个设计为32位的DLL,或者windows系统本身是32位安装(即使机器本身是64位的)

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

在这两台计算机上尝试基本操作:右键单击文件资源管理器中的
计算机
,然后单击
属性
-查看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\u freeze开发者使用它来选择
base
。由于
sys.platform
是错误的,因此基数是错误的。也许cx\U freeze开发者可以解决这个问题?我们如何报告此错误?
import sys; print (sys.platform)
win32
base=Win32GUI