• 26.08.2025, 11:07
  • Register
  • Login
  • You are not logged in.

 

xx_ElBarto

God

[b] python script | für gratis webs... *jetzt gui*

Tuesday, September 21st 2004, 9:02pm

also, hab in python nen script geschrieben, womit man große files bei webspace anbietern hochladen kann welche eine dateigrößen begrenzung besitzen. (außerdem kann man die files direkt in foren etc verlinken)

download (updated *2*):
python muss installiert sein
(da gibts python: www.python.org)
hab gerade kein py2exe installiert, deswegen gibts atm keine exe

mousonmars

Full Member

Re: [b] python script | für gratis webspace a

Tuesday, September 21st 2004, 9:07pm

mal ne blöde frage was is PHYTON :-[

mous

xx_ElBarto

God

Re: [b] python script | für gratis webspace a

Tuesday, September 21st 2004, 9:11pm

python is ne programmiersprache, aber warte einfach bis yogi kommt, dann gibts wieder ne ausführliche erklärung ;D

Y0Gi

God

Re: [b] python script | für gratis webspace a

Tuesday, September 21st 2004, 9:38pm

hehe wozu, jetzt hab ich meinen ersten gesellen ja ausgebildet ;)


du solltest die files besser als .tar.gz/.tgz oder .zip verbreiten. unter linux muss ich mir als user erst ne unrar-binary kompilieren :(
zusätzlich kannste für windows-leute auch ne executable mit py2exe erstellen - die wird allerdings ne menge extra-files mitbekommen (notgedrungen), so dass ein installiertes python als basis die bessere wahl ist. auch kann py2exe windows-installer erstellen - afaik aber nur für libraries (in /site o.ä.), keine eigentlichen programme.
EDIT: ich sehe, das hast du bereits getan. allerdings solltest du deine dateinamen überdenken, weil "nopy" nicht sagt, ob es executables mit/ohne source oder die sourcen plus den python-installer (plattform?) enthält.

weitere tipps:
- ein leerzeichen nach dem einleitenden kommentar-# erhöht die lesbarkeit
- bei einigen if-konstrukten hast du überflüssige klammern verwendet, lass die der lesbarkeit halber besser weg
- benutze wie auch in php vorzugsweise ' statt " bei strings, dictionary-keys usw. um parse-zeit zu sparen
- hast du dir mal das ConfigParser-modul angeschaut? damit lassen sich einfachts .ini-dateien einlesen.
- fange exceptions möglichst nicht mit except: ohne angabe der exception, da du a) nicht auf alles vorbereitet bist und b) damit z.b. auch sys.exit() gefangen werden kann - also fang nur, was du auch behandeln willst
- schau dir mal die printf-syntax bei print-statements an, damit kannst du einiges lesbarere machen, z.b.:

Source code

1
2
3
4
5
# auszug aus deinem script
print "STATUS: " + str(left) + " KB left. average speed: " + "%.1f" % avg + " KB/s"

# besser
print 'STATUS: %.1f KB left. average speed: %.1f KB/s' % (str(left), avg)

ok, offensichtlich hast du es schon versucht :)


zum php-teil:
- warum hat die index keine endung wie .php?
- auch hier gilt lieber ' als ", wenn nix darin zu parsen ist
- statt $size = $size + filesize($file); besser $size += filesize($file);
- statt && und || tun es auch and und or, die obendrei weit besser lesbar und nicht nur für anfänger einleuchtender sind


unter welcher lizenz steht dein code? da du es eh schon hier veröffentlichst: mach GPL draus. wie der vorgeschlagene header ausschaut, kannst du auf der homepage nachsehen oder z.b. bei mir auf homework von aktuellen produkten abgucken. hinweis: das ascii-bildchen gehört nicht dazu :)


ansonsten: schön gemacht. einfach, gelle? :)

xx_ElBarto

God

Re: [b] python script | für gratis webspace a

Tuesday, September 21st 2004, 9:55pm

das mit dem zip/tar.gz is mir immernoch net so recht klar, denn ich glaube mit bunzip2 kann man die dateien doch auch unter linux entpacken, und sie sind kleiner als zips :)

py2exe: hab ich ja benutzt, der erste link enthält ne exe, und der zweite nur das script ;)

das config parser tool hab ich mir noch net angeschaut, die leute im irc haben mir gesagt ich soll das so machen:
config = {}
execfile("config.cfg", config)
und so funktionierts auch wie es soll ;D

Y0Gi

God

Re: [b] python script | für gratis webspace a

Tuesday, September 21st 2004, 10:03pm

hab mal aktualisiert.
.zip und .tar.gz sind einfach die quasi-standards für windows und linux und am verbreitetsten. auch wenn bzip2, ace, rar, 7zip + co noch so doll packen - wenn man die tools nicht zur hand hat, nützt das gar nix.

schau dir trotzdem den config-parser an. glaub mir :)

xx_ElBarto

God

Re: [b] python script | für gratis webspace a

Wednesday, September 22nd 2004, 1:46am

so, nachdem ich meine deutsch charakterisierung fertig hatte hab ich mich nu daran gesetzt ;D
die downloads im ersten post hab ich geupdated

- zip statt rar
- ein leerzeichen nach dem einleitenden kommentar-# erhöht die lesbarkeit
- bei einigen if-konstrukten hast du überflüssige klammern verwendet, lass die der lesbarkeit halber besser weg
- benutze wie auch in php vorzugsweise ' statt " bei strings, dictionary-keys usw. um parse-zeit zu sparen
- hast du dir mal das ConfigParser-modul angeschaut? damit lassen sich einfachts .ini-dateien einlesen.

- fange exceptions möglichst nicht mit except: ohne angabe der exception, da du a) nicht auf alles vorbereitet bist und b) damit z.b. auch sys.exit() gefangen werden kann - also fang nur, was du auch behandeln willst
- schau dir mal die printf-syntax bei print-statements an, damit kannst du einiges lesbarere machen

- warum hat die index keine endung wie .php?
- auch hier gilt lieber ' als ", wenn nix darin zu parsen ist
- statt $size = $size + filesize($file); besser $size += filesize($file);
- statt && und || tun es auch and und or, die obendrei weit besser lesbar und nicht nur für anfänger einleuchtender sind

unter welcher lizenz steht dein code? da du es eh schon hier veröffentlichst: mach GPL draus

;D

und wie mach ich das mit den exceptions?
bzw wie find ich z.b. raus welches ich dafür brauche wenn der ordner net vorhanden is?

Y0Gi

God

Re: [b] python script | für gratis webspace a

Wednesday, September 22nd 2004, 2:54pm

die doku sollte dir sagen, welche exceptions das modul werfen könnte. allein schon zum testen solltest du das auch produ-/provozieren können :)
wenn du sie nicht fängst, wird die ausführung mit nennung der nicht gefangenen exception abgebrochen - daher wüsstest du z.b. ihren namen. manchmal lohnt es sich auch, oberklassen von exceptions zu fangen, um z.b. i/o-fehler abzudecken. vielleicht kennst du das aus java, dort gibts ne generelle IOException und spezieller die davon abgeleitete FileNotFoundException.

update: mich wundert, dass du gerade bei cwd() eine exception fängst, beim connecten, einloggen, uploaden etc. aber nicht. dort sollte natürlich auch was gefangen werden. da du aber bei cwd() was fängst, gehe ich davon aus, dass du bereits einem fehler begegnet bist. auch wenn's nicht alles abdeckt und optimal zu nennen ist, versuch einfach mal, fehler zu produzieren: ungültiger ftp-host/-port, falsche login-daten, etc. dann siehst du, was für exceptions auftreten und du kannst sie fangen und entsprechend behandeln.

Y0Gi

God

Re: [b] python script | für gratis webspace a

Wednesday, September 22nd 2004, 3:12pm

schön, schön, schön, das gefällt mir schon viel besser!

ich empfehle dir noch, dein script in methoden oder gleich in eine ganze klasse aufzuteilen. zudem solltest du docstrings verwenden, auch im header. diese sollten aus gründen der einheitlichkeit aus dreifachen (multiline) doppelten anführungszeichen bestehen. siehe dazu PEP 257: http://www.python.org/peps/pep-0257.html

insgesamt zum python-code-style siehe PEP 8: http://www.python.org/peps/pep-0008.html
dort wird auch erläutert, warum du deine imports (wie in deiner ersten version) jeweils in eigene zeilen schreiben solltest. und natürlich einige andere essentielle konventionen.


noch ein paar tipps:

Source code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# deine möglichkeit
print '----------------------------'

# besser, weil flexibler, kürzer, genauer
# zudem _könnte_ man die zeilenbreite einer gemeinsamen variablen entnehmen und müsste nur diese anpassen
print '-' * 28



# dein code
if (os.path.exists('DEFAULT.ini') != True):
# - überflüssige klammern
# - bei bool'schen ausdrücken ist kein expliziter vergleich mit einer bool-konstante notwendig. der "vergleichspartner" hat ebenfalls einen wahrheitswert, so dass man "if" oder "if not" (in anderen sprachen meist "if (!...)") benutzen kann

# besser
if not os.path.exists('DEFAULT.ini'):


# dein code
config.set('DEFAULT', 'server', raw_input('ftp server ip: '))
config.set('DEFAULT', 'user', raw_input('username: '))  
config.set('DEFAULT', 'pw', raw_input('password: '))
config.set('DEFAULT', 'length', raw_input('maximum file length of the server in bytes: '))
config.set('DEFAULT', 'folder', raw_input('dir where uploaded files should be stored: '))

# heute im angebot: loops
# ich verwende ein atomares (unveränderliches) tupel von tupeln (spart speicher ggüber einer liste oder einem dictionary)
settings = (
    ('server', 'ftp server ip'),
    ('user', 'username'),
    ('pw', 'password'),
    ('length', 'maximum file length of the server in bytes'),
    ('folder', 'dir where uploaded files should be stored')
)
# ich iteriere durch das tupel
# hier kannst du besser austauschen, was mit jedem eintrag passieren soll
# zur verdeutlichung der aufsplittung in jedem durchlauf:
#     key, label = ('server', 'ftp server ip')   # z.b.
for key, label setting in settings:
    config.set('DEFAULT', key, raw_input(label + ': '))



weiter so!

xx_ElBarto

God

Re: [b] python script | für gratis webspace a

Wednesday, September 22nd 2004, 11:38pm

danke für die ganzen tips :)
mitlerweile hab ich nun fast alle davon umgesetzt ;D
mal wieder update im ersten post ;)

Y0Gi

God

Re: [b] python script | für gratis webspace a

Thursday, September 23rd 2004, 1:25am

fein, fein, fein. kriegst auch noch mehr tipps :)

wenn du deine files mit datumsangaben versiehts (was nicht schlecht ist), dann a) schreib das jahr 4stellig und b) schreib es rückwärts, also z.b. 2004-09-22, damit die dateien stets über ihren dateinamen auch gleich zeitlich richtig sortiert werden.


docstrings:

Source code

1
2
3
def configure():
    """Ask the user for configuration data and store it to file."""
    print ...

dann: in python sind alles dynamische objekte. d.h. du kannst über configure auf die funktion an sich zugreifen und sie auch speichern, sie über configure() wie erwartet ausführen und z.b. über configure.__doc__ eben auf ihren docstring zugreifen. das kann man auch sinnvoll im code verwenden, um automatisch hilfetexte zu generieren.


exkurs "module in python":
in python kann man jedes script auch als modul aus einer anderen datei oder im interaktiven interpreter laden. heißt die datei "meins.py", kann man sie mit "import meins" laden. dabei hat sie den namespace "meins" und man kann mit "meins.configure()" auf ihre methoden zugreifen. mit "from meins import configure" kann man die methode configure() oder klassen, variablen, etc. in den globalen namespace des importierenden scripts laden und sie ohne "meins." davor verwenden.
auch in deinem fall empfiehlt es sich, den code so zu gestalten, dass man ihn später wiederverwenden kann, z.b. über eine GUI oder in einer website.


es empfiehlt sich folgendes konstrukt am ende der datei, dass nur ausgeführt wird, wenn das script direkt ausgeführt und nicht als modul geladen wird:

Source code

1
2
if __name__ == '__main__':
    main()

der hauptteil des codes, der die anderen funktionen verwendet, kann entweder direkt anstelle von main() dort stehen oder aber eben in eine eigene methode main() ausgelagert werden. dies ist sinnvoll, wenn man ein script ohne "dos"-fenster starten möchte. unter windows kann man die datei dann in .pyw umbenennen und sie wird ohne console gestartet. will/muss man das original beibehalten, kann man die .pyw neu erzeugen und in ihr das andere modul importieren und über obiges konstrukt + den entsprechenden namespace ihre main-funktion aufrufen - das geht nicht, wenn der code im teil steht, der nur bei direktem aufruf ausgeführt wird.

Source code

1
2
3
4
5
6
7
8
"""meinscriptmitGUI.pyw
script ohne console starten, z.b. weil es eine gui hat
"""

import meinscript

if __name__ == '__main__':
    meinscript.main()



Source code

1
2
3
4
value = raw_input('step ' + str(y) + ':\n' + label + ': ')

# besser mit %
value = raw_input('step %d:\n%s: ' % (y, label))
und wenn du mit "y" schritte zählst, dann nenn das ding doch auch "step".


Source code

1
2
3
4
5
if value != '':
                config.set('DEFAULT', key, value)
                break
            else:
                print 'value is not valid'
das else: (nicht aber das print) ist überflüssig, da du im falle des if abbiegst und aus der schleife springst, daher würde das print auch nicht ausgeführt werden. das print muss dann natürlich auch ausgerückt werden (bis auf höhe des if), damit es nicht als teil des if-blocks ausgeführt wird.


Source code

1
2
3
4
5
6
7
8
9
10
if os.path.exists(file):
            try:
                f = open(file, 'rb')
                break;
            except:
                print ' ... Unexpected error:', sys.exc_info()[0]
                print 'TIP: the file you entered exists but can not be opened, check your permissions'
                return()
        else:
            print 'file ' + file + ' does not exist'

- hinter dem break ist ein ";". das ist nicht nötig, schadet eher (der lesbarkeit) und wird nur gebraucht, wenn man mehrere befehle in eine zeile schreiben möchte (was man tunlichst nicht sollte!). scheint aus gewohntheit dort hingekommen zu sein :)
- "return" ist keine funktion und wird daher ohne () geschrieben. wird kein wert angegeben, wird immer None zurückgegeben.
- du kannst die lesbarkeit weiter verbessern, indem du die fehlerbehandlung am anfang durchführst und dann den nicht erreichbaren rest nicht mehr einrückst (das else weglassen, s.o.)

Source code

1
2
3
4
5
6
7
8
9
10
if [u]not[/u] os.path.exists(file):
            print 'file ' + file + ' does not exist'
            continue # breche diesen loop ab und beginne einen neuen durchlauf
        try:
            f = open(file, 'rb')
            break
        except:
            print ' ... Unexpected error:', sys.exc_info()[0]
            print 'TIP: the file you entered exists but can not be opened, check your permissions'
            return



um pfad-teile zu konkatenieren, empfiehlt sich ein blick auf die entsprechenden methoden im modul "os", da man ja auf verschiedenen OS auch mit verschiedenen pfad-trennzeichen zu tun hat.


übrigens: es gibt in python KEIN switch-statement, wohl aber einige (fragwürdige) versuche, es zu erzeugen. braucht man aber nicht, sagt guido v.r., und darum gibt es das nicht als separates sprachkonstrukt.

xx_ElBarto

God

Re: [b] python script | für gratis webs... *j

Tuesday, September 28th 2004, 1:09am

so, hab das ganze nun nochmal nen bißchen überarbeitet und mit tkinter in nen gui gepackt, download wie das letzte mal auch im ersten post geupdated ;)

hab jedoch ein prob:
wenn ich auf upload klicke, dann wird das status fenster erst geupdated wenn er mit dem kompletten upload fertig is, aber es soll ja zwischendurch immer den status ausgeben, wie mach ich das?

Y0Gi

God

Re: [b] python script | für gratis webs... *j

Wednesday, September 29th 2004, 12:43am

bin grad nicht sicher. vllt nen thread starten, der das macht.

hab dein script bisher noch nicht ausgeführt, aber kann man denn überhaupt infos über den transfer-status zwischendurch beziehen?

schau dir mal auf homework meinen id3reader oder mnemonic-pw-dings an. dort kannst du ersehen, wie man das gui hübsch in eine klasse packt und dann startet. im prinzip kann man den frame an sich auch in andere widgets einsetzen.
deine methoden und der eigentliche code sind ziemlich vermischt, besonders die methoden con() und upl() sind scheiße zu lesen. benutze auch docstrings!!! ein nebeneffekt ist auch die verbesserte lesbarkeit, insb. mit gescheitem syntax-HL.

einige dinge schreibst du oft unterschiedlich, ein paar konventionen aus den PEPs:
- vor kommas kommt kein leerzeichen, aber danach
- um operatoren (z.b. =, +, etc.) steht auf jeder seite genau ein leerzeichen
- in methodensignaturen werden die benannten parameter direkt ans = geschrieben, etwa def xy(x=1, y=2)
- einfache anführungszeichen bei strings!!