QCoreApplication не завершается изящно - PullRequest
0 голосов
/ 03 октября 2018

Я новичок в PyQt5.Я написал простой CLI-скрипт, который делает GET-запрос, печатает результат, а затем завершает работу с ошибкой: «QWaitCondition: уничтожено, пока потоки все еще ждут»

Что я делаю неправильно?Мой код показан ниже:

from PyQt5.QtCore import QCoreApplication, QObject, QUrl
from PyQt5.QtNetwork import QNetworkRequest, QNetworkAccessManager, QNetworkReply
import sys

class MainWindow(QObject):
    def __init__(self):
        super().__init__()

        target = "http://pyqt.sourceforge.net/Docs/PyQt5/index.html"
        request = QNetworkRequest(QUrl(target))

        self.networkAccessManager = QNetworkAccessManager()
        #self.networkAccessManager.finished[QNetworkReply].connect(self.headsUp)
        self.networkAccessManager.finished.connect(self.onFinished)
        self.networkAccessManager.get(request)

    def onFinished(self, response): #response is an object of type QNetworkReply
        error = response.error()

        if (error == QNetworkReply.NoError):
            result = response.readAll()
            print(response.header(QNetworkRequest.ContentTypeHeader))
            print(response.header(QNetworkRequest.LastModifiedHeader))
            print(response.header(QNetworkRequest.ContentLengthHeader))
        else:
            print("There was an error. "+response.errorString())

        self.windUp(response)        

    def windUp(self, replyObject): #replyObject is an object of type QNetworkReply
        print("Done")
        replyObject.deleteLater()
        QCoreApplication.quit()       


if __name__ == '__main__':

    qApp = QCoreApplication(sys.argv)
    w = MainWindow()
    sys.exit(qApp.exec_())

1 Ответ

0 голосов
/ 03 октября 2018

Когда я запускаю ваш код, я не получаю никакой ошибки, только я получаю пустой ответ.

text/html
None
0
Done

И это правильно, потому что в этом URL нет ничего контента, так как если вы используете браузермы увидим, что он перенаправляет нас на другой URL: https://sourceforge.net/projects/pyqt/, поэтому для включения этого перенаправления анализируется атрибут ответа RedirectionTargetAttribute.

import sys
from PyQt5 import QtCore, QtNetwork


class MainWindow(QtCore.QObject):
    def __init__(self):
        super().__init__()
        target = "http://pyqt.sourceforge.net"
        self.manager = QtNetwork.QNetworkAccessManager(self)
        self.manager.finished.connect(self.on_finished)
        self.start_request(target)

    def start_request(self, url):
        request = QtNetwork.QNetworkRequest(QtCore.QUrl(url))
        self.manager.get(request)

    @QtCore.pyqtSlot(QtNetwork.QNetworkReply)
    def on_finished(self, reply):
        redirection_target = reply.attribute(QtNetwork.QNetworkRequest.RedirectionTargetAttribute)
        if reply.error():
            print("There was an error. {}".format(response.errorString()))
        elif redirection_target is not None:
            reply.deleteLater()
            print("redirection_target: {}".format(redirection_target))
            self.start_request(redirection_target)
        else:
            print(reply.header(QtNetwork.QNetworkRequest.ContentTypeHeader))
            print(reply.header(QtNetwork.QNetworkRequest.LastModifiedHeader))
            print(reply.header(QtNetwork.QNetworkRequest.ContentLengthHeader))
            print(reply.readAll())
            reply.deleteLater()
            QtCore.QCoreApplication.quit()


if __name__ == '__main__':
    app = QtCore.QCoreApplication(sys.argv)
    w = MainWindow()
    sys.exit(app.exec_())

Вывод:

redirection_target: PyQt5.QtCore.QUrl('https://sourceforge.net/projects/pyqt/')
text/html; charset=utf-8
None
None
b'<!doctype html>\n<!-- Server: sfs-consume-8 -->\n<html class="no-js" lang="en">\n    <head>\n        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><script type="text/...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...