
Wenn man die meiste Zeit im Terminal verbringt, ist es doch manchmal sehr angenehm, nicht immer nur Schwarz/Weiß zu sehen. Über den RSS Feed von PyPI bin ich auf 2 Python Module aufmerksam geworden, mit denen man seine Skripte in etwas Farbe tauchen kann:
Zum Ausprobieren von Python Modulen ist virtualenv ein Muss.
Beide Module sind recht klein und einfach zu verwenden. "termstyle" hat eigentlich alles was man so braucht, kann man aber nicht durch eigene Farben erweitern. "pycolors" dagegen bietet Default nur Farben und keine Styles wie Fettdruck an, das lässt sich aber über die Angabe von ANSI Codes realisieren.
Wer es noch etwas mächtiger brauch, kann sich mal Fabulous anschauen.
Beispiel termstyle


#!/usr/bin/env python from termstyle import * print bg_magenta("-----------------") print bg_magenta("Background Colors") print bg_magenta("-----------------") print print bg_black("bg_black") print bg_blue("bg_blue") print bg_cyan("bg_cyan") print bg_default("bg_default") print bg_green("bg_green") print bg_magenta("bg_magenta") print bg_red("bg_red") print bg_white("bg_white") print bg_yellow("bg_yellow") print print magenta("-----------------") print magenta("Foreground Colors") print magenta("-----------------") print print black("black") print blue("blue") print cyan("cyan") print green("green") print magenta("magenta") print red("red") print white("white") print yellow("yellow") print print magenta("------") print magenta(underscore("Styles")) print magenta("------") print print default("default") print italic("italic") print reset("reset") print reset("reset") print underscore("underscore") print print magenta("------") print magenta(bold("Weight")) print magenta("------") print print bold("bold") print inverted("inverted") print print magenta("------------") print magenta(bold("Combinations")) print magenta("------------") print print "%s: %s" % (red('CRITICAL'), bold('Houston, we have a problem!')) print "%s: %s" % (red('CRITICAL'), bold(red('Houston, we have a problem!'))) print
Beispiel pycolors

#!/usr/bin/env python from colors import * print black("black") print blue("blue") print brown("brown") print cyan("cyan") print dark_gray("dark_gray") print green("green") print light_blue("light_blue") print light_cyan("light_cyan") print light_gray("light_gray") print light_green("light_green") print light_purple("light_purple") print light_red("light_red") print purple("purple") print red("red") print white("white") print yellow("yellow")
Matthias und ich haben gestern Nacht ein wenig Extreme Programming durchgeführt. Er war der Driver und hat gecodet und ich saß als Co-Pilot neben dran.
Heraus kam ein kleines Python Skript, welches einen RSS Feed für neue Python Module im Python Package Index (PyPI) erzeugt. PyPI bietet nämlich derzeit nur einen Feed an, der die letzten 40 Updates bestehender Module anzeigt. Das kann sehr viel Einträge in einem RSS Reader geben.
Das Skript geht nun in die Testphase und den erzeugten Feed findet man unter:
Den Quellcode dazu gibt es auf Launchpad:
Kürzlich hab ich einen etwas längeren Download angestoßen, der via Fire-and-Forget einfach alles gezogen hat, was er kriegen kann. Das bedeutet, dass es mit Sicherheit viele Pfade gibt, die keine Daten enthalten. Das Skript hat jedoch immer ein sogenanntes Pickle File abgelegt, das einfach nur das gerade benutzte Objekt serialisiert hat und auf Platte gespeichert. Die Ordnerstruktur sieht z.B. so aus:
|── 004ee81b2697d8c7-367448064 │ │ │ ├── 1951630894 │ │ ├── data.pickle │ │ └── Stargate Atlantis - 3x19 - Vengeance.srt │ │ │ ├── 1951630970 │ │ |__ data.pickle │ │ │ ├── 1951631043 │ │ |___ data.pickle │ │
Jetzt wollte ich einfach alle Ordner wissen, die nur dieses Pickle File enthalten, also quasi alle Ordner, die nur 1 Datei als Inhalt haben. Und wie immer gibt es da was Leckeres in Python. Das os - Modul kennt eine Methode walk() die rekursiv durch den Ordner düst und in jedem Durchgang einem den aktuellen Pfad, dessen Verzeichnisse und dessen Dateien zurückgibt in Form eines Tupels. Pythonisch wie man es halt gewohnt ist.
Hier ist das Snippet, wie ich das Verzeichnis, in dem ich mich befinde, rekursiv nach Ordnern suche, die nur eine Datei haben:
import os search_dir = "." for folder, subfolders, files in os.walk(search_dir): if not len(files) > 1: print folder
Tja, so einfach kann es sein.
Ach ja, os.walk() ist ein Generator, d.h. man muss mindestens eine For-Loop nutzen. Wenn man folgenden Fehler bekommt, benutzt man os.walk() nicht richtig:
ValueError: too many values to unpack
Heute wollte ich ein monolitisches Python File der FLubtitles API etwas modularisieren. Ich hatte mich initial an das Beispiel von wsgi-jsonrpc gehalten. Also einfach eine Klasse erstellen, diese instanzieren und an WSGIJSONRPCApplication übergeben.
... def class Common(): def LogIn(): def LogOut(): ...
import os import sys import wsgi_jsonrpc sys.path = [os.path.dirname(__file__)] + sys.path from api import Common() methods = Common() application = wsgi_jsonrpc.WSGIJSONRPCApplication(instance=methods)
Da ich api.py nun aufteilen wollte, ergaben sich jedoch mehrere Klassen und ich kann aber nur eine Instanz an WSGIJSONRPCApplication übergeben. Jedoch gibt es auch die Möglichkeit statt einer Klassen-Instanz auch einfach eine Liste der Methoden zu übergeben. Jetzt musste ich es nur noch hinbekommen, alle Methoden einzusammeln und unnötige rauszufiltern. Ich bin dann auf ein nettes Module namens inspect gestoßen. Sehr hilfreich waren die Beispiele auf Dough Hellmann's Seite.
class Auth(): def CreateAccount(): def LogIn():
class Common(): def GetSubtitleLanguages(): def GetStatusCodes():
import os import sys import inspect import wsgi_jsonrpc sys.path = [os.path.dirname(__file__)] + sys.path from api.common import Common from api.auth import Auth common = Common() auth = Auth() api_methods = [] for name, data in inspect.getmembers(common, inspect.ismethod): if name != '__init__': api_methods.append(data) for name, data in inspect.getmembers(auth, inspect.ismethod): if name != '__init__': api_methods.append(data) application = wsgi_jsonrpc.WSGIJSONRPCApplication(methods=api_methods)
So funktioniert es nun. Mit dem Module inspect macht man quasi eine Razzia durch seine Files und schaut sich an, was es an Daten gibt :-)