QNetworkReply/QNetworkAccessManager verhalten sich in Submethode anders als in der main()-Methode

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
jw202
User
Beiträge: 3
Registriert: Sonntag 14. Januar 2018, 16:39

Montag 15. Januar 2018, 21:30

Liebe Community,

Ich hätte wieder eine Frage. Und zwar hab ich ein Python-Skript geschrieben, dass eine Datei über FTP zu einem gegebenen Server hochlädt (siehe 1. Listing). Das funktioniert auch gut. Datei wird hochgeladen und Funktion finished() wird aufgerufen. Wenn ich den Code für den Upload in eine eigene Funktion upload() kopiere, dann geht leider nichts mehr. (siehe 2. Listing)

Code: Alles auswählen

import sys
from PyQt5.QtCore import QUrl
from PyQt5.QtCore import QFile
from PyQt5.QtNetwork import QNetworkAccessManager
from PyQt5.QtNetwork import QNetworkRequest
from PyQt5.QtCore import QCoreApplication


def finished():
    print("finished")


def error():
    print("error")


def main():
    app = QCoreApplication(sys.argv)
    url = QUrl("ftp://domain.at/upload/test.jpg")
    url.setUserName("jw202")
    url.setPassword("mainpassword")
    url.setPort(21)

    file = QFile("fsm.jpg")
    file.open(QFile.ReadOnly)

    nam = QNetworkAccessManager()
    req = QNetworkRequest(url)
    rep = nam.put(req, file)
    rep.finished.connect(finished)
    rep.error.connect(error)
    return app.exec_()


main()

Auslagerung in eine Funktion update(). Nicht funktionsfähig. Request kommt nie an, Signal wird nicht aktiviert

Code: Alles auswählen

def finished():
    print("finished")


def upload():
    url = QUrl("ftp://domain.at/upload/test.jpg")
    url.setUserName("jw202")
    url.setPassword("dasdfsadf")
    url.setPort(21)

    file = QFile("fsm.jpg")
    file.open(QFile.ReadOnly)

    nam = QNetworkAccessManager()
    req = QNetworkRequest(url)
    rep = nam.put(req, file)
    rep.finished.connect(finished)
    rep.error.connect(error)


def error():
    print("error")


def main():
    app = QCoreApplication(sys.argv)
    upload()
    return app.exec_()


main()



Meine Idee wäre, dass die Garbage Collection den QNetworkAccessManager() frühzeitig löscht, wenn man aus der Funktion wieder heraus geht. Hab daher die Zeile

Code: Alles auswählen

nam = QNetworkAccessManager()
vor den Aufruf von main() verschoben, damit dieser als globale Variable nach Methodenaufruf erhalten bleibt. Da hatte ich einen Segmentation fault bekommen.

Bin leider mit meinen Ideen am Ende :(
Vielleicht wüsste jemand einen guten Ansatz.

Vielen Dank schon im Voraus
Liebe Grüße
Sirius3
User
Beiträge: 7785
Registriert: Sonntag 21. Oktober 2012, 17:20

Dienstag 16. Januar 2018, 08:10

@jw202: soweit ich mich erinnern kann, darf man auch viele Sachen nicht vor einem `QCoreApplication`-Aufruf machen. Das einfachste wäre aber auch, den NetworkAccessManager zurückzugeben. Prinzipiell kommst Du aber nicht umhin, eigene Klassen zu schreiben, wo der Manager dann ein Attribut wäre. Namen dürfen übrigens mehr als 3 Buchstaben haben, so dass man sich nicht wundern braucht, was name, requirement oder representation in diesem Kontext bedeuten.
Antworten