首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >cx-freeze "ImportError: DLL加载失败:%1不是有效的Win32应用程序“

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

Stack Overflow用户
提问于 2019-12-08 03:19:51
回答 1查看 381关注 0票数 1

在我安装了一个python/pyqt/matplotlib应用程序后,我得到了一个错误,我用cx-freeze冻结了它。我用来构建应用程序

代码语言:javascript
复制
python setup.py build

setup.py是这样的

代码语言:javascript
复制
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)

我得到了

代码语言:javascript
复制
Mecanica-SectionPropertyCalculator-0.1-amd64.exe 

.exe在我的开发机器上运行正常

然后使用以下命令创建一个msi安装程序

代码语言:javascript
复制
cx-freeze app bdist_msi

我得到了

代码语言:javascript
复制
Mecanica-SectionPropertyCalculator-0.1-amd64.msi 

我将其安装到另一台具有相同操作系统、i5处理器等的计算机上,结果出现错误

代码语言:javascript
复制
File "C:\...SpcPlotQt.py", line 4 in <module> 
ImportError: DLL load failed: %1 is not a valid Win32 application

现在,SpcPlotQt.py是我的代码,在第4行我有

代码语言:javascript
复制
from PyQt5.QtWidgets import QDialog, QApplication

我已经安装了PyQt5.5.13.2和pip3 (所有64位),并且我非常确定我安装了Python3.7 x64,我通过

代码语言:javascript
复制
import struct; print( 8 * struct.calcsize("P"))
64

另外,如果我运行

代码语言:javascript
复制
import sys; print("%x" % sys.maxsize, sys.maxsize > 2**32)
True

代码语言:javascript
复制
import ctypes; print (ctypes.sizeof(ctypes.c_voidp))
8

代码语言:javascript
复制
import platform; platform.architecture()[0]
64bit

代码语言:javascript
复制
import os; os.environ["PROCESSOR_ARCHITECTURE"]
AMD64

上面的5个测试都表明所有东西都是64位的。

但是当我跑的时候

代码语言:javascript
复制
import sys; print (sys.platform)
win32

为什么?

还有..。cx-freeze脚本使用sys.platform来决定要使用的基础,因此它选择

代码语言:javascript
复制
base=Win32GUI

我该怎么办?

我注意到python setup.py build运行在cmd shell中,无论我如何打开它,它总是32位的;即使是PowerShell也是32位的。这会是问题所在吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-12-08 04:51:33

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

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

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

另一种解决方案是:在您的dev机器上安装python32位版本,使包含它的exe文件在32位和64位系统上都能正常工作。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59229385

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档