Columnizer (jetzt: shcol)

Stellt hier eure Projekte vor.
Internetseiten, Skripte, und alles andere bzgl. Python.
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

:oops: OMG! Ich möchte überhaupt nicht wissen, welche Blüten sich da noch so in meinen docstrings befinden... :?
Und dabei hab' ich mir doch jetzt fest vorgenommen, ganz viele englischsprachige Vortragsvideos etc. anzuschauen, damit ich nächstes Jahr auf der Europython in Berlin einigermaßen Land sehe...

Aber das muss ich wohl nochmals überdenken.... :mrgreen:

mutetella
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
Benutzeravatar
snafu
User
Beiträge: 6732
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

@mutella: Naja, das gesprochene Wort im Vortragsvideo hilft dir wenig, um zwischen "peace" vs. "piece" zu unterscheiden... ;)
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

@snafo: Dabei gäbe es ein so klasse Lernvideo... Aber Du hast Recht, ich sollte mir doch vorher nochmals das dazugehörige Lehrmaterial durchlesen... :)

mutetella
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
Benutzeravatar
snafu
User
Beiträge: 6732
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Vielleicht ein kleines Update für Interessierte: `shcol` kann inzwischen von der Kommandozeile aus bedient werden.

Beispiel (unter Linux Mint), um alle mit "python3" beginnenden DEB-Pakete rauszusuchen und mittels `shcol` hübsch anzuordnen:

Code: Alles auswählen

$ dpkg --get-selections 'python3*' | awk '{ print $1 }' | shcol
python3                        python3-lxml
python3-apt                    python3-minimal
python3-aptdaemon              python3-oauthlib
python3-aptdaemon.gtk3widgets  python3-pkg-resources
python3-aptdaemon.pkcompat     python3-pyatspi2
python3-brlapi                 python3-pycurl
python3-cairo                  python3-software-properties
python3-crypto                 python3-speechd
python3-dbus                   python3-virtkey
python3-defer                  python3-xkit
python3-gdbm                   python3.2
python3-gi                     python3.2-minimal
python3-gi-cairo               python3.3
python3-httplib2               python3.3-minimal
python3-louis
Ich werde noch eine Option einbauen, um einzelne Spalten selektieren zu können, ohne dass `awk` oder ähnliche Tools dazwischen geschaltet werden müssen.

Hinweis: Die Kommandozeilentauglichkeit wird erst mit Version 0.2 kommen, welche noch nicht veröffentlicht worden ist. Den aktuellen Stand kann man sich aber aus dem Github-Repo laden und hat dann Version "0.2-dev". Bei einem Aufruf der "setup.py" wird unter anderem eine ausführbare Datei namens "shcol" erstellt, die (zumindest bei mir) in "/usr/local/bin" landet. Anschließend kann `shcol` dann wie ein Shell-Tool genutzt werden.

EDIT: Zeilenlänge und Spaltenabstand stehen standardmäßig auf 80 bzw 2 Zeichen. Dies lässt sich aber auch ändern.

Eine Ausgabe mit 100 Zeichen als Breite (width) und 5 Zeichen als Abstand (spacing) würde bei mir so aussehen:

Code: Alles auswählen

$ dpkg --get-selections 'python3*' | awk '{ print $1 }' | shcol -w100 -s5
python3                           python3-gdbm              python3-pycurl
python3-apt                       python3-gi                python3-software-properties
python3-aptdaemon                 python3-gi-cairo          python3-speechd
python3-aptdaemon.gtk3widgets     python3-httplib2          python3-virtkey
python3-aptdaemon.pkcompat        python3-louis             python3-xkit
python3-brlapi                    python3-lxml              python3.2
python3-cairo                     python3-minimal           python3.2-minimal
python3-crypto                    python3-oauthlib          python3.3
python3-dbus                      python3-pkg-resources     python3.3-minimal
python3-defer                     python3-pyatspi2
Benutzeravatar
snafu
User
Beiträge: 6732
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Kann mal bitte jemand mit nem Windows-System testen, ob dieser Code zur Ermittlung der Terminalbreite bei ihm erwartungsgemäß funktioniert? Ich habe den quasi blind aufgrund von ein paar Google-Treffern geschrieben und habe hier leider keine Möglichkeit zum Testen unter Windows... :(
fail
User
Beiträge: 122
Registriert: Freitag 11. Januar 2013, 09:47

Läuft ohne Fehlermeldungen, aber gibt nichts aus.??

Edit: Windows 8.1 64-bit
Benutzeravatar
snafu
User
Beiträge: 6732
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

fail hat geschrieben:Läuft ohne Fehlermeldungen, aber gibt nichts aus.??

Edit: Windows 8.1 64-bit
Es geht darum, dass `get_terminal_width()` ausgeführt werden soll und ob die angegebene Breite zutrifft. Am besten auch mal während der Sitzung in der Python-Shell das Terminal-Fenster breiter und schmaler machen und gucken, ob sich die Werte anpassen. Und ruhig sowohl über `cmd.exe` als auch über die PowerShell.

EDIT: Ok, vielleicht hätte ich ein paar Erläuterungen dazu schreiben sollen. Die Funktion soll z.B. so ausgeführt werden:

Code: Alles auswählen

import sys
import _termwidth

_termwidth.get_terminal_width(sys.stdout, 80)
fail
User
Beiträge: 122
Registriert: Freitag 11. Januar 2013, 09:47

Oh, sorry.

Hier die Fehlermeldungen:
test.py ist der Originalcode.
test2.py ist der

Code: Alles auswählen

import test
import sys

test.get_terminal_width(sys.stdout, 80)
IDLE:

Code: Alles auswählen

Traceback (most recent call last):
  File "C:\Users\fail\Desktop\test2.py", line 4, in <module>
    test.get_terminal_width(sys.stdout, 80)
  File "C:\Users\fail\Desktop\test.py", line 34, in get_terminal_width
    num_handle = -(10 + tty_file.fileno())
io.UnsupportedOperation: fileno
cmd:

Code: Alles auswählen

Traceback (most recent call last):
  File "test2.py", line 4, in <module>
    test.get_terminal_width(sys.stdout, 80)
  File "C:\Users\fail\Desktop\test.py", line 35, in get_terminal_width
    handle = GetStdHandle(num_handle)
TypeError: this function takes 2 arguments (1 given)
Powershell:

Code: Alles auswählen

Traceback (most recent call last):
  File "test2.py", line 4, in <module>
    test.get_terminal_width(sys.stdout, 80)
  File "C:\Users\fail\Desktop\test.py", line 35, in get_terminal_width
    handle = GetStdHandle(num_handle)
TypeError: this function takes 2 arguments (1 given)
Benutzeravatar
snafu
User
Beiträge: 6732
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

@fail: Schonmal vielen, vielen Dank für deinen Einsatz. :)

Kannst bitte mal die neue Version von `_termwidth.py` testen? Am besten nochmal so ausführlich, wie du es gerade schon getan hast. Übrigens kannst du jetzt einfach ``_termwidth.test()`` (ggf an deinen Modulnamen anpassen) aufrufen.

Achso, noch was: Welche Python-Version verwendest du?
fail
User
Beiträge: 122
Registriert: Freitag 11. Januar 2013, 09:47

Python 3.3.2
fail
User
Beiträge: 122
Registriert: Freitag 11. Januar 2013, 09:47

Gute Nachrichten.
Mit cmd und Powershell funktionert es.
Im IDLE:

Code: Alles auswählen

Traceback (most recent call last):
  File "C:\Users\fail\Desktop\termwidth.py", line 71, in <module>
    print(test())
  File "C:\Users\fail\Desktop\termwidth.py", line 68, in test
    fd = sys.__stdout__.fileno()
AttributeError: 'NoneType' object has no attribute 'fileno'
Benutzeravatar
snafu
User
Beiträge: 6732
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

@fail: Naja, das Skript nutzt jetzt auch einfach eine Builtin-Funktion zur Ermittlung der Terminalgröße, die seit Python 3.3 neu hinzugekommen ist. Daher hatte ich auch nach der Python-Version gefragt.

Bitte ersetze mal den `if hasattr...`-Teil (ziemlich am Anfang) durch ein `if False:`, damit er zu Testzwecken wieder die "ctypes"-Variante nutzt. Die Tests in IDLE können weg bleiben. Das scheint ohne größere Verrenkungen nicht zu funktionieren. Schon mein (versuchter) Workaround mit `sys.__stdout__` ist IMHO keine wirklich saubere Lösung.
fail
User
Beiträge: 122
Registriert: Freitag 11. Januar 2013, 09:47

Auch so funktionert es in der cmd und Powershell.
Benutzeravatar
snafu
User
Beiträge: 6732
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Super. Nochmals herzlichen Dank. Ich gehe dann mal davon aus, dass ich den kompletten Code zur automatischen Ermittlung der Terminalbreite für das Projekt comitten kann. Ich arbeite nur noch an ein paar Feinheiten...
Benutzeravatar
snafu
User
Beiträge: 6732
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

shcol 0.2-dev geht langsam aber sicher in Richtung Zielgerade. Ich habe auf der Github-Seite mal die Readme-Datei überarbeitet, damit ein größerer Fokus auf die neuen Highlevel-Funktionen (z.B. ``print_filenames()``) gelegt wird. In Kürze folgt noch eine Vorstellung der Kommandozeilen-Funktionalität des Tools. Nach Installation der Entwicklungsversion kann man sich dies bereits mittels ``shcol --help`` gerne ansehen. :)

Achso, und könnte jemand von den Mods den Thread ins Showcase-Forum verschieben? Danke.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

snafu hat geschrieben:Achso, und könnte jemand von den Mods den Thread ins Showcase-Forum verschieben? Danke.
Bitte schoen :)
Benutzeravatar
snafu
User
Beiträge: 6732
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

cofi hat geschrieben:
snafu hat geschrieben:Achso, und könnte jemand von den Mods den Thread ins Showcase-Forum verschieben? Danke.
Bitte schoen :)
Sehr viel Danke. :)
Benutzeravatar
snafu
User
Beiträge: 6732
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Vor wenigen Tagen habe ich shcol 0.2-rc1 hochgeladen. Dabei handelt es sich um eine Art Vorschauversion auf die bevorstehende Version 0.2. Ich werde noch die Abdeckung durch Tests vergrößern und Dokumentation im HTML-Format herausbringen. Doku ist zwar schon relativ detailliert vorhanden, jedoch bisher nur in Form von Docstrings. Im Grunde kann dieses Release schon produktiv eingesetzt werden. Das finale shcol 0.2 wird auf jeden Fall kompatibel zu dem jetzigen Pre-Release sein. Man sollte nur beachten, dass es im Vergleich zu Version 0.1 neben zahlreichen Erweiterungen auch ein paar Umbenennungen gab. Version 0.2 ist daher *nicht* vollständig abwärtskompatibel zu Version 0.1.
Benutzeravatar
snafu
User
Beiträge: 6732
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Soeben habe ich shcol 0.2 auf PyPI hochgeladen.

Für eine grobe Doku muss man sich zunächst mit der README-Datei begnügen, deren Inhalt auch für die PyPI-Paketbeschreibung übernommen wurde. Die geplante HTML-basierte Dokumentation habe ich erstmal verschoben.

Zusätzlich ist `shcol` auch als Shell-Tool verwendbar. Sowohl für Linux als auch für die Windows PowerShell. Beispiele für beide "Welten" erhält man durch Eingabe von `shcol --help`:

Code: Alles auswählen

usage: shcol [-h] [-s N] [-w N] [-S] [-U] [-c N] [-v] [item [item ...]]

Generate columnized output for given string items.

Columize and sort:
shcol -S foo bar baz

Columnize command output on Linux (Debian):
shcol -S -c0 < /proc/modules
dpkg --get-selections 'python3*' | shcol -c0 -s4

Columnize process names on Windows PowerShell:
ps | foreach {$_.name} | shcol -U

positional arguments:
  item               an item to columnize
                     (read from stdin if item arguments are not present)

optional arguments:
  -h, --help         show this help message and exit
  -s N, --spacing N  number of blanks between two columns (default: 2)
  -w N, --width N    maximal amount of characters per line
                     (use terminal width by default)
  -S, --sort         sort the items
  -U, --unique       process only the first occurrence of an item
                     (i.e. doublets are eliminated)
  -c N, --column N   choose a specific column per line via an index value
                     (indices start at 0, column separator is whitespace)
                     will only work when items are supplied via stdin
  -v, --version      show program's version number and exit
Für Windows-Benutzer ist zu beachten, dass der Skript-Ordner vom verwendeten Python-Interpreter im PATH eingetragen sein muss, sofern man `shcol` als einfachen Befehl (also ohne umständliche Pfadangabe) verwenden möchte. Dies wurde bei der Python-Installation automatisch vorgenommen, sofern man das entsprechende Häkchen angeklickt hat.

`shcol` ist noch nicht komplett durchgetestet. Ich wollte aber mal wieder releasen, zumal ich intern einiges an Refactoring durchführen werde. Das wäre mir ein zu krasser Sprung vom vorherigen "rc1" gewesen.

Wie immer bin ich dankbar über jede Rückmeldung (Fehlermeldungen, Verbesserungsvorschläge, ...) und übernehme keinerlei Haftung für die Auswirkungen möglicher Fehlfunktionen seitens `shcol`.
Benutzeravatar
snafu
User
Beiträge: 6732
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Es ist nun HTML-Dokumentation verfügbar:

https://shcol.readthedocs.org/

Bisher gibt es bloß einen groben Überblick mit einigen Beispielen für CLI und Python-API (d.h. vom Modul `shcol.highlevel`). Zu beiden werde ich aber noch detailliert die Funktionsweise beschreiben.

Alle anderen Module sollen erstmal intern bleiben. Hier muss man sich mit den Docstrings im Python-Code begnügen und kann sich auch nicht auf eine garantierte Abwärtskompatibilität in späteren Releases verlassen. Früher oder später werde ich aber wohl zumindest eine offizielle Formatter-API dokumentieren, die dann auch stabil bleiben soll.
Antworten