Hallo Com
hätte eine Frage wie man folgende idee realisiert:
Habe zB einen Server mit einer CGI bei der ich über nen post den dateinamen und die datei selbst senden kann. Während des Prozesses kann CGI schon sagen wieviel Prozenz ich bereits raufgeladen habe und mit einer anderen könnte ich diese information aufrufen.
Ich weiß zB nich ob das python geht, dass wenn ich grade eine offene verbindung mit http habe, sprich die während des gesammten upload prozesses aktiv is und alle 4 sekunden ausgabe macht, ob ich diese mit python verarbeiten kann.
Das andere wäre, wie könnte man das dann so umsetzen das dabei das programm noch nutzbar is und nicht einfriert. Und naja Prozessbar natürlich mit drin und so..
Dachte mir das da zB ersma urllib zur sprache kommt und threads....nur frage is halt wie man das genau macht.
Kann mir einer nen Tipp geben oder nen code beispiel?
danke
mfg
scrippi
Daten Upload mit GTK
- veers
- User
- Beiträge: 1219
- Registriert: Mittwoch 28. Februar 2007, 20:01
- Wohnort: Zürich (CH)
- Kontaktdaten:
Tipp: Lies die Dokumentation zu den Modulen und stell dann konkrete Fragen.
[url=http://29a.ch/]My Website - 29a.ch[/url]
"If privacy is outlawed, only outlaws will have privacy." - Phil Zimmermann
"If privacy is outlawed, only outlaws will have privacy." - Phil Zimmermann
Naja mir ist einfach nich klar wie ich einen Upload/Download Prozess mit prozessbalken bauen kann ohne dass das programm einfriert, bzw das man einfach den prozess im hintergrund hat.
Und eben ob Urllib langzeitige http verbindungen offen halten kann ( wie zb bei einem WebCGI Dateiupload)
Und eben ob Urllib langzeitige http verbindungen offen halten kann ( wie zb bei einem WebCGI Dateiupload)
-
- User
- Beiträge: 996
- Registriert: Mittwoch 9. Januar 2008, 13:48
Zerstückele die Datei in x-Kilobytes-Blöcke update den Fortschrittsbalken jedes mal :-)
-
- User
- Beiträge: 996
- Registriert: Mittwoch 9. Januar 2008, 13:48
Und weils Spaß macht:
Code: Alles auswählen
from sys import stdout
from time import sleep
from os.path import getsize
path = ('/deine/tolle/datei')
def progressed_read(stream):
size = getsize(path)
while stream.tell() < size:
yield stream.read(1024**2)
# 1 MB
print '*',
stdout.flush()
sleep(0.05)
with open(path) as stream:
fragments = progressed_read(stream)
data = ''.join(fragments)
@Dauerbaustelle: "Streams" haben in der Regel keine abfragbare Grösse, da ist die Namensgebung ungünstig.
Warum ist der `path` in Klammern!?
Warum ist der `path` in Klammern!?
-
- User
- Beiträge: 996
- Registriert: Mittwoch 9. Januar 2008, 13:48
Äh, weil ich da nen ewiglangen Pfad drinne hatte, und hätte ich keine Klammer drumrumgemacht, hätte ich Einrückungsfehler für die zweite und dritte Zeile bekommen und das war mir alles viel zu anstrengend :-)BlackJack hat geschrieben:Warum ist der `path` in Klammern!?
- veers
- User
- Beiträge: 1219
- Registriert: Mittwoch 28. Februar 2007, 20:01
- Wohnort: Zürich (CH)
- Kontaktdaten:
http://docs.python.org/library/threading.html damit kannst du weitere Threads starten.scrippi hat geschrieben:Naja mir ist einfach nich klar wie ich einen Upload/Download Prozess mit prozessbalken bauen kann ohne dass das programm einfriert, bzw das man einfach den prozess im hintergrund hat.
Und eben ob Urllib langzeitige http verbindungen offen halten kann ( wie zb bei einem WebCGI Dateiupload)
http://www.google.ch/search?q=urllib+file+upload da findest du heraus wie du file uploads startest.
http://www.google.ch/search?q=urllib2+progress und da wie du den Status herausfindest.
Das zusammenkleben überlasse ich dir
[url=http://29a.ch/]My Website - 29a.ch[/url]
"If privacy is outlawed, only outlaws will have privacy." - Phil Zimmermann
"If privacy is outlawed, only outlaws will have privacy." - Phil Zimmermann
Danke danke
es ist zwar noch ein wenig tricky wegen dem upload, da an der Stelle viel vom Upload script auf dem Server abhängig ist, jedoch als Downloadscript konnte ich eine Solide lösung finden
hier meine Codes:
load_progress.glade
download_progress1.py
es ist zwar noch ein wenig tricky wegen dem upload, da an der Stelle viel vom Upload script auf dem Server abhängig ist, jedoch als Downloadscript konnte ich eine Solide lösung finden
hier meine Codes:
load_progress.glade
Code: Alles auswählen
<?xml version="1.0"?>
<interface>
<requires lib="gtk+" version="2.16"/>
<!-- interface-naming-policy project-wide -->
<object class="GtkWindow" id="window1">
<property name="visible">True</property>
<child>
<object class="GtkVBox" id="vbox1">
<property name="visible">True</property>
<property name="orientation">vertical</property>
<child>
<object class="GtkEntry" id="entry1">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="invisible_char">●</property>
</object>
<packing>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkButton" id="button1">
<property name="label" translatable="yes">button</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkProgressBar" id="progressbar1">
<property name="visible">True</property>
<property name="activity_mode">True</property>
<property name="text" translatable="yes">Prozess</property>
</object>
<packing>
<property name="expand">False</property>
<property name="position">2</property>
</packing>
</child>
</object>
</child>
</object>
</interface>
Code: Alles auswählen
#!/usr/bin/env python
#Importiere die Ganzen Mist hierrein
import sys
import os
import urllib
try:
import pygtk
pygtk.require("2.0")
except:
raise ImportError("Could not import pygtk")
try:
import gtk
import gtk.glade
except:
raise ImportError("Could not import the module gtk")
sys.exit(1)
from threading import Thread
class DownloadProgress(Thread):
"""
Klasse zur Darstellung des Programms
"""
def __init__(self):
Thread.__init__(self)
#Set the Glade file
self.gladefile = "download_progress.glade"
self.wTree = gtk.glade.XML(self.gladefile)
self.window = self.wTree.get_widget("window1")
self.window.connect("destroy",gtk.main_quit) #Beenden einstellen
#Binde Objekte ins Dokument
button = self.wTree.get_widget("button1")
self.tf = self.wTree.get_widget("entry1")
button.connect("released",self.loading)
self.pbar = self.wTree.get_widget("pbar")
self.pbar.set_fraction(0)
def run(self):
gtk.gdk.threads_enter()
gtk.main()
gtk.gdk.threads_leave()
def loading(self,w,d=None):
"""
Eventfunktion von button1
Argumente
self - <Object> Selfobject
w - <Object> Widgektobject
d - <String> URL
"""
d = self.tf.get_text()
url = d
base = url[url.rindex('/')+1:]
#Beginne Thread
current = loadFile(url, base, self)
current.start()
#current.join()
class loadFile(Thread):
"""
Klasse zum Laden der Datei
"""
def __init__(self,url,dst,obj):
Thread.__init__(self)
self.url = url
self.dst = dst
self.obj = obj
print "started"
def run(self):
print "joined"
print "get url '%s' to '%s'" % (self.url, self.dst)
if sys.stdout.isatty():
urllib.urlretrieve(self.url, self.dst,
lambda nb, bs, fs, url=self.url: _reporthook(nb,bs,fs,self.url,self.obj))
sys.stdout.write('\n')
else:
urllib.urlretrieve(self.url, self.dst,
lambda nb, bs, fs, url=self.url: _reporthook(nb,bs,fs,self.url,self.obj))
sys.stdout.write('\n')
def _reporthook(numblocks, blocksize, filesize, url, obj):
"""
Partielles Laden der Datei
"""
base = os.path.basename(url)
#XXX Should handle possible filesize=-1.
try:
percent = min((numblocks*blocksize*100)/filesize, 100)
except:
percent = 100
obj.pbar.set_fraction(percent * 0.01)
obj.pbar.set_text("%s Percent of %s" % (percent,base))
if __name__ == "__main__":
# python download_progress1.py help
if len(sys.argv) == 2 and sys.argv[1] == "help":
help(DownloadProgress)
help(loadFile)
exit()
#Starte alle Threads
gtk.gdk.threads_init()
t = DownloadProgress()
t.start()