2 Stimmen

Wie bekommt man einen Upload-Fortschrittsbalken für urllib2?

Derzeit verwende ich den folgenden Code, um hochladen eine Datei auf einen entfernten Server:

import MultipartPostHandler, urllib2, sys
cookies = cookielib.CookieJar()
opener = urllib2.build_opener(MultipartPostHandler.MultipartPostHandler)
params = {"data" : open("foo.bar") }
request=opener.open("http://127.0.0.1/api.php", params)
response = request.read()

Dies funktioniert gut, aber für größere Dateien der Upload dauert einige Zeit, und es wäre schön, einen Callback, der mir erlaubt, um den Upload-Fortschritt anzuzeigen haben?

Ich habe bereits die Lösung von kodakloader ausprobiert, aber es gibt keinen Callback für eine einzelne Datei.

Kennt jemand eine Lösung?

3voto

Sam Dolan Punkte 30838

Hier ist ein Ausschnitt aus unserem Python-Abhängigkeitsskript, das Chris Phillips und ich arbeitete an @ Cogi (auch wenn er diesen speziellen Teil der Arbeit erledigt hat). Das vollständige Skript ist aquí .

    try:
        tmpfilehandle, tmpfilename = tempfile.mkstemp()
        with os.fdopen(tmpfilehandle, 'w+b') as tmpfile:
            print '  Downloading from %s' % self.alternateUrl

            self.progressLine = ''
            def showProgress(bytesSoFar, totalBytes):
                if self.progressLine:
                    sys.stdout.write('\b' * len(self.progressLine))

                self.progressLine = '    %s/%s (%0.2f%%)' % (bytesSoFar, totalBytes, float(bytesSoFar) / totalBytes * 100)
                sys.stdout.write(self.progressLine)

            urlfile = urllib2.urlopen(self.alternateUrl)
            totalBytes = int(urlfile.info().getheader('Content-Length').strip())
            bytesSoFar = 0

            showProgress(bytesSoFar, totalBytes)

            while True:
                readBytes = urlfile.read(1024 * 100)
                bytesSoFar += len(readBytes)

                if not readBytes:
                    break

                tmpfile.write(readBytes)
                showProgress(bytesSoFar, totalBytes)

    except HTTPError, e:
        sys.stderr.write('Unable to fetch URL: %s\n' % self.alternateUrl)
        raise

1voto

thejoshwolfe Punkte 5038

Ich denke, es ist unmöglich, den Upload-Fortschritt mit urllib2 zu kennen. Ich überlege, pycurl zu verwenden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X