【发布时间】:2015-05-18 10:19:40
【问题描述】:
我开发 PyQt5 软件已经有一段时间了。过去,我设法将我的 Python 3 PyQt5 软件与 py2exe 打包在一起,一切正常。
但是,现在我遇到了一个问题,即打包的 exe 程序在用户退出时会崩溃。更具体地说,我得到了带有以下详细信息的 APPCRASH
问题签名: 问题事件名称:APPRCASH 应用程序名称: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 调试。无论如何,我在我的业务逻辑代码上发现了一个区域,如果删除该区域将消除问题。但是,此代码与 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()”程序将正确退出。什么给了?
【问题讨论】:
-
我在我的代码中发现了一个奇怪的地方,如果我删除了一个我从未使用过的函数(忘记删除它),问题就消失了。然而,在应用程序中有另一个看起来完全正常的代码区域,当导入时,它会以某种方式在退出时弄乱垃圾收集。我遇到访问冲突。
标签: python debugging crash pyqt py2exe