我一直在开发一个PyQt5软件。我已经设法用py2exe打包我的Python 3 PyQt5软件,并且一切正常。
但是,现在我遇到了一个问题,当用户退出时,打包的exe程序会崩溃。更具体地说,我得到APPCRASH以及以下细节
问题签名: 问题事件名称:APPCRASH 应用程序名称:Sotilasmatrikkelit.exe 应用版本:0.0.0.0 应用程序时间戳:54467a51 故障模块名称:PyQt5.QtCore.pyd 故障模块版本:0.0.0.0 故障模块时间戳:549be77e 例外代码:c0000005 异常抵消:0010c185 操作系统版本:6.1.7601.2.1.0.256.4 区域设置ID:1035 附加信息1:0a9e 附加信息2:0a9e372d3b4ad19135b953a78882e789 附加信息3:0a9e 附加信息4:0a9e372d3b4ad19135b953a78882e789
在开发期间从Pycharm运行软件时,我从未遇到此崩溃。知道如何调试这个或一般可能是什么原因?
我怀疑这可能与内存管理有关(PyQt不会在退出时正确删除所有资源,因此会出现段错误)但是有没有人有任何好的建议来找出确切的问题而没有更好的调试信息?我应该尝试在退出时进行某种清理吗? Atm我开始这样的软件:
def start():
import sys
app = QApplication(sys.argv)
fixingtool = Mainwindow(app)
fixingtool.show()
sys.exit(app.exec_())
其他调查似乎表明我收到了由C ++空指针引起的访问冲突。听起来很可怕,因为我不太了解PyQt调试。无论如何,我在businesslogic代码上找到了一个区域,如果删除它将删除问题。但是,这段代码与PyQt无关,只是常规的Python代码,不应该有任何不同。最奇怪的是,如果我从代码中删除某些函数,即使在运行时没有调用函数,问题也会消失,这意味着只导入带有这些函数的文件会导致问题。以下是代码示例:
import re
from books.karelians.extraction.extractors.baseExtractor import BaseExtractor
from books.karelians.extraction.extractionExceptions import *
from books.karelians.extraction.extractors.dateExtractor import DateExtractor
from shared import textUtils
from books.karelians.extractionkeys import KEYS
from interface.valuewrapper import ValueWrapper
from shared import regexUtils
from books.karelians.extraction.extractors.professionextractor import ProfessionExtractor
class SpouseExtractor(BaseExtractor):
def extract(self, text, entry):
super(SpouseExtractor, self).extract(text)
self.entry = entry
self.PATTERN = r"Puol\.?(?P<spousedata>[A-ZÄ-Öa-zä-ö\s\.,\d-]*)(?=(Lapset|poika|tytär|asuinp))"
self.NAMEPATTERN = r"(?P<name>^[\w\s\.-]*)"
self.OPTIONS = (re.UNICODE | re.IGNORECASE) #TODO: TRY IGNORE CASE?
self.REQUIRES_MATCH_POSITION = False
self.SUBSTRING_WIDTH = 100
self.hasSpouse = False
self.spouseName = ""
self.profession = {KEYS["profession"] : ValueWrapper("")}
self.initVars(text)
self._findSpouse(text)
return self._constructReturnDict()
def initVars(self,text):
pass
def _findSpouse(self, text):
try:
self.foundSpouse = regexUtils.safeSearch(self.PATTERN, text, self.OPTIONS)
self.hasSpouse = True
self._findSpouseName(self.foundSpouse.group("spousedata"))
self._setFinalMatchPosition()
except regexUtils.RegexNoneMatchException:
pass
def _findSpouseName(self, text):
try:
name = regexUtils.safeSearch(self.NAMEPATTERN, text, self.OPTIONS)
self.spouseName = name.group("name").strip()
self._findProfession(text[name.end():])
except regexUtils.RegexNoneMatchException:
self.errorLogger.logError(SpouseNameException.eType, self.currentChild)
def _findProfession(self, text):
professionExt = ProfessionExtractor(self.entry, self.errorLogger, self.xmlDocument)
professionExt.setDependencyMatchPositionToZero()
self.profession = professionExt.extract(text, self.entry)
def _setFinalMatchPosition(self):
#Dirty fix for inaccuracy in positions which would screw the Location extraction
self.matchFinalPosition = self.foundSpouse.end() + self.matchStartPosition - 4
def _constructReturnDict(self):
print(self.profession)
return {KEYS["spouse"]: ValueWrapper({ KEYS["hasSpouse"]: ValueWrapper(self.hasSpouse),KEYS["spouseName"]: ValueWrapper(self.spouseName), KEYS["spouseProfession"]: ValueWrapper(self.profession[KEYS["profession"]].value) })}
如果我删除或注释掉所有函数“initVars()”程序正确退出。是什么给了什么?
答案 0 :(得分:1)
这对问题本身并不是一个真正的解决方案,但是如果有人遇到类似的问题我会把它留在这里。
今天我决定尝试使用cx_freeze而不是py2exe来确定问题可能与py2exe有关,因为在使用普通的python解释器运行应用程序时没有发生整个问题。
事实证明我是对的,在使用cx_freeze而不是py2exe打包应用程序后,问题似乎神奇地消失了。我没有对代码进行任何更改。关于py2exe和cx_freeze如何工作的人比我更了解可能能够解释差异。我的猜测是,由于某种原因,从Python解释器中退出并没有在py2exe案件中完美处理,不知何故弄乱了垃圾清理。通过不正确配置py2exe,我不知道这是py2exe还是我的错。
无论如何,我很高兴它现在有效,因为昨天是一个非常令人沮丧的一天。