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