Python

Python makes things simple

Python in Farbe

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")

RSS Feed für neue Python Module goes Beta

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:

Rekursiv alle Ordner finden mit nur 1 Datei als Inhalt

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

Linktüte

Python Razzia

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.

Vorher

  • api.py

...
def class Common():
 
    def LogIn():
 
    def LogOut():
...

  • json-rpc.wsgi

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.

Nachher

  • api/auth.py

class Auth():
 
    def CreateAccount():
 
    def LogIn():

  • api/common.py

class Common():
 
    def GetSubtitleLanguages():
 
    def GetStatusCodes():

  • json-rpc.wsgi

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 :-)

Syndicate content