UliCommander - Ein Dateimanager

Stellt hier eure Projekte vor.
Internetseiten, Skripte, und alles andere bzgl. Python.
Antworten
ulrich1992
User
Beiträge: 42
Registriert: Montag 8. November 2010, 15:25
Wohnort: Braunschweig
Kontaktdaten:

Mein neustes Projekt ein Dateimanager à la Norton Commander. Aktuell ist Version 1.6.
Ich habe das Programm entwickelt weil mich einige Sachen im Windows Explorer stören und um mich in wxPython besser einzuarbeiten.

Mann kann beispielsweise im Gegensatz zum Windows Explorer auch Dateinamen erstellen, die mit einem Punkt anfangen (.htaccess).

Ab Version 1.5 kann UliCommander *.zip, *.tar.gz und *.tar.bz2 Dateien entpacken.
Man kann Befehle über die Kommandozeile aufrufen, Funktionstasten nutzen und Dateien in einem Texteditor öffnen.
Unter Windows ist notepad, unter Linux gedit voreingestellt als Editor. chmod wird unterstützt, man kann Dateien drucken (lpr).

Die ältere Linux Version (1.3) ist als Python-Code verfügbar. Für Windows gibt auch eine mit py2exe kompilierte Version mit Installer.

Ich plane bald die aktuelle Version als Linux-Source zu veröffentlichen, allerdings muss ich dafür die Windows-only Funktionen entfernen.

Mehr Informationen zu dem Projekt, Screenshots und Downloads gibt es unter folgender URL:

http://www.deruli.de/seite/ulicommander_dateimanager
deets

Ich habe mir mal mangels Sourcecode fuer die neueste Version die 1.3 runtergeladen.

Da gibt's so manches zu bemerken:

- caseinsensitive_sort <=> sorted(my_list, key=lambda x: x.lower())
- statt "for drive in ['A', 'B',...]" kann man gleich ueber einen String iterieren: "for drive in 'ABC...'"
- du vermischst Logik mit GUI. Deine ganzen Operationen koennten in einem kleinen, System-abhaengigen Kernmodul liegen, und die UI benutzt das nur. Macht das Leben viel leichter zum tests schreiben, aber auch fuer den OS-Support usw.

- benutze os.path.join
- try/except ohne Spezialisierung - nicht gut. Machst du dir selbst nur das Leben schwer mit.
- gigantische if-elif-Kaskaden um einen numerischen Wert auf einen String abzubilden (onSortChange) - dazu sind Dictionaries erfunden worden
- global Variablen sind nicht gut, was passiert, wenn du mal mehrere Fenster mit unterschiedlich sortierten Views haben willst - dann ist "orderby" ein Problem als globale Variable.
- runString2 ist zum ersten schlecht benannt, zweitens reicht es, nur subprocess zu benutzen (auf allen Plattformen), und last but not least ist ein fallback auf os.startfile nicht so gut denke ich - wer weiss, was da alles schief gehen kann. Und multi-threading ist fuer gestartete Unterprozesse ebenfalls nicht angezeigt.
- wenn du schon threading willst, dann benutze das Modul threading, nicht thread.

- benutze try/finally fuer die os.chdir-Geschichten.

Das soll erstmal reichen.
ulrich1992
User
Beiträge: 42
Registriert: Montag 8. November 2010, 15:25
Wohnort: Braunschweig
Kontaktdaten:

deets hat geschrieben:Ich habe mir mal mangels Sourcecode fuer die neueste Version die 1.3 runtergeladen.

Da gibt's so manches zu bemerken:

- caseinsensitive_sort <=> sorted(my_list, key=lambda x: x.lower())
Das ist ein Beispielcode aus einem Forum.
Weil ich nicht wusste, wie ich eine Case Insensitive Sortierung durchführen sollte.

deets hat geschrieben: - statt "for drive in ['A', 'B',...]" kann man gleich ueber einen String iterieren: "for drive in 'ABC...'"
In der aktuellen Version habe ich die Iteration durch einen Windows-API Aufruf ersetzt.
deets hat geschrieben: - du vermischst Logik mit GUI. Deine ganzen Operationen koennten in einem kleinen, System-abhaengigen Kernmodul liegen, und die UI benutzt das nur. Macht das Leben viel leichter zum tests schreiben, aber auch fuer den OS-Support usw.
OK, da hast du Recht.
deets hat geschrieben: - benutze os.path.join
Wo ist da der Unterschied zu os.path.abspath()?
deets hat geschrieben: - gigantische if-elif-Kaskaden um einen numerischen Wert auf einen String abzubilden (onSortChange) - dazu sind Dictionaries erfunden worden
Dictionaries sind mir bekannt.
Aber wie meinst du das jetzt in Beziehung zu den Größeneinheiten?
Was gibt es für Methoden um die Dateigrößen je nach Größe in Byte, KB MB oder GB anzugeben?

deets hat geschrieben: - runString2 ist zum ersten schlecht benannt, zweitens reicht es, nur subprocess zu benutzen (auf allen Plattformen), und last but not least ist ein fallback auf os.startfile nicht so gut denke ich - wer weiss, was da alles schief gehen kann. Und multi-threading ist fuer gestartete Unterprozesse ebenfalls nicht angezeigt.

os.startfile() öffnet eine Datei unter Windows mit der Standardanwendungen.
Was gibt es denn für Alternativen dazu?
die ganzen Popen Funktionen dienen ja nur dazu um externe Prozesse zu starten (*.exe).

deets hat geschrieben: - wenn du schon threading willst, dann benutze das Modul threading, nicht thread.
Ohne Threading hängt das ganze Programm, bis der Subprocess beendet ist.

- benutze try/finally fuer die os.chdir-Geschichten.

Das soll erstmal reichen.[/quote]
deets

Wo ist da der Unterschied zu os.path.abspath()?
Das ist kein Unterschied, das ist was anderes. Du schreibst sowas hier:

Code: Alles auswählen

os.path.abspath(cwdp+"/"+unicode(self.ListCtrl_Dateien.GetItemText(index)))
Das waere dann

Code: Alles auswählen

os.path.abspath(os.path.join(cwdp, unicode(self.ListCtrl_Dateien.GetItemText(index))))
Damit sparst du dir Systemabhaengige Pfadtrenner, und besser sieht es auch aus.
Dictionaries sind mir bekannt.
Aber wie meinst du das jetzt in Beziehung zu den Größeneinheiten?
Was gibt es für Methoden um die Dateigrößen je nach Größe in Byte, KB MB oder GB anzugeben?
Nein, ich meine sowas

Code: Alles auswählen


if evt.GetId()==119:
            sortby="aufsteigend"
        elif evt.GetId()==120:
            sortby="absteigend"
        elif evt.GetId()==115:
            orderby="name"
        elif evt.GetId()==116:
            orderby="datum"
        elif evt.GetId()==117:
            orderby="groesse"
        elif evt.GetId()==118:
            orderby="typ"
Sowas macht man in Python als

Code: Alles auswählen

{ 116 : "datum", 117 : "groesse", ...}[evt.getId()]
Oder zB mit dict.get(evt.getId(), "default_sortierung")

os.startfile() öffnet eine Datei unter Windows mit der Standardanwendungen.
Was gibt es denn für Alternativen dazu?
die ganzen Popen Funktionen dienen ja nur dazu um externe Prozesse zu starten (*.exe).
Das Problem ist nicht die Alternative, sondern dein fallback - erstmal als subprocess ausfuehren, *dann* mit startfile. Ich wuerde entweder das eine oder das andere machen, wahrscheinlich abhaengig von der File-Endung.

Ohne Threading hängt das ganze Programm, bis der Subprocess beendet ist.
Weil du es nicht richtig benutzt. Verwende suprocess.Popen, und dann zB Timer in wx, um den Status abzufragen.
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

ulrich1992 hat geschrieben:Ich plane bald die aktuelle Version als Linux-Source zu veröffentlichen, allerdings muss ich dafür die Windows-only Funktionen entfernen.
Warum die Windows-only Funktionen entfernen? Also ich meine, schmeißt den Code einfach auf github.com und arbeite weiter dran. Ist es nicht so, das es im Grunde nie fertig ist. Mann kann immer weiter arbeiten, Dinge schöner erledigen usw. Fertig wird Software doch nie, oder? :lol:

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Antworten