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....
mutetella
Columnizer (jetzt: shcol)
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit )
@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
mutetella
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit )
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:
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:
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
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
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...
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.fail hat geschrieben:Läuft ohne Fehlermeldungen, aber gibt nichts aus.??
Edit: Windows 8.1 64-bit
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)
Oh, sorry.
Hier die Fehlermeldungen:
test.py ist der Originalcode.
test2.py ist der
IDLE:
cmd:
Powershell:
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)
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
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)
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)
@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?
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?
Gute Nachrichten.
Mit cmd und Powershell funktionert es.
Im IDLE:
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'
@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.
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.
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...
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.
Achso, und könnte jemand von den Mods den Thread ins Showcase-Forum verschieben? Danke.
- cofi
- Python-Forum Veteran
- Beiträge: 4432
- Registriert: Sonntag 30. März 2008, 04:16
- Wohnort: RGFybXN0YWR0
Bitte schoensnafu hat geschrieben:Achso, und könnte jemand von den Mods den Thread ins Showcase-Forum verschieben? Danke.
Michael Markert ❖ PEP 8 Übersetzung ❖ Tutorial Übersetzung (3.x) ⇒ Online-Version (Python 3.3) ❖ Deutscher Python-Insider ❖ Projekte
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.
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`:
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`.
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
`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`.
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.
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.