Archiv nach Schlagworten: python

freiesMagazin: Einführung in Python

Da ich mit dem Erscheinen des 12. Teils meiner kleinen Einführung in Python erstmal eine ausgedehnte Pause einlegen werde, hier einmal ein kurzer Überblick der bisher erschienen Teile:

Bei Gelegenheit werde ich nochmal versuchen, die letzten sechs (oder gleich alle 12?) Teile zu bündeln. Außerdem steht noch eine Python3-Aktualisierung an: Zwar ist Python2 noch immer der Standard in der Linux-Welt. Mittels GObject-Integration lässt sich aber inzwischen anständig GTK in Python3 programmieren.

 

Conky und die Fußball EM 2012

Ich bin neulich zufällig auf OpenLigaDB gestoßen, ein Community-Projekt, das zeitnah Sport-Ergebnisse als Webservice zur Verfügung stellen will. Über die SOAP-Schnitstelle lassen sich die Daten unkompliziert und ohne Registrierung abrufen.

Ich habe dazu ein kleines Python-Skript gebaut, das jeweils ausgibt, welche Spiele an einem Tag stattfinden und wie es ggf. gerade steht. Die Ausgabe eignet sich gut für die Einbindung in Conky.

Für das Skript gibt es eine Github-Projektseite. Es sollte genügen, die Datei csi.py im Ordner ~/.conky abzulegen und in der Datei ~/.conkyrc einen Eintrag wie diesen anzufügen:

${font size=11:italic}${color slate grey}Fußball EM 2012 ${hr}${color }${font }
${execi 120 python ~/.conky/csi.py}

Das Skript benötigt das Modul “suds”, das bei vielen Distributionen als “python-suds” oder “python2-suds” zur Verfügung stehen sollte. Unter Umständen (beispielsweise unter Arch) muss der Aufruf python durch python2 ersetzt werden, weil das Skript nur unter Python2 lauffähig ist. Wenn Python2 in eurer Distribution ohnehin noch der Standard ist, funktioniert der Aufruf python ~/.conky/csi.py aber auch.

Wirkliche “Echtzeitergebnisse” sind übrigens mit diesem Skript letztlich nicht möglich: Zum Einen werden die Ergebnisse bei OpenLigaDB händisch eingetragen, so dass es dort schon zu Verzögerungen von etwa einer Minute  kommen kann, zum Anderen empfiehlt es sich auch, Conky das Skript in größeren Intervallen ausführen zu lassen, um OpenLigaDB und den eigenen Rechner nicht unnötig zu belasten.

/edit: SUDS-Abhängigkeit ergänzt

Kleiner Ersatz für nautilus-open-terminal

Da die Erweiterung nautilus-open-terminal schon seit einiger Zeit für Probleme sorgt und Nautilus abstürzen lässt (Fehlermeldung,Bericht bei Chris) und ich mir ohnehin mal die Python-Schnittstelle von Nautilus ansehen wollte, habe ich eine kleine Erweiterung geschrieben, die nautilus-open-terminal ersetzen soll, bis das Original wieder einwandfrei arbeitet.

Die von Chris angesprochenen Probleme mit “Nautilus-Python” scheinen insgesamt darauf zurückzuführen zu sein, dass für Nautilus-Erweiterungen die GTK3-Anbindung jetzt zwingend erforderlich sind. Durch die Ableitung von GObject ließen sich in meinem Fall also die Probleme beseitigen.

Wer sich meine “open-terminal”-Variante einmal ansehen möchte, kann dies bei GitHub tun. Abgelegt wird das Skript im Verzeichnis ~/.local/share/nautilus-python/extensions/, wobei ich das Verzeichnis in meinem Fall erst noch erstellen musste.

freiesMagazin – Python Sonderausgabe

Das freieMagazin hat eine Python-Sonderausgabe veröffentlicht, in der die bisher erschienenen 6 Teile meiner Python-Einführung, die ich nun seit etwa einem halben Jahr für das freieMagazin schreibe, zusammengefasst wurden.

Wer die Reihe noch nicht kennt, kann mit der Sonderausgabe ja mal einen Einstieg wagen. Und auch so ist diese Zusammenstellung vielleicht nochmal eine ganz nette Übersicht für Anfänger.

Ganz lieben Dank an dieser Stelle übrigens an Christian Hausknecht, der mir seit dem zweiten Teil der Reihe als geduldiger und kompetenter Korrektor zur Seite steht!

I wanna watch this!

Wer sich auf Youtube, Google Video oder sonstwo im Netz gerne von Flash-Videos berieseln lässt, kennt das Problem: Nach x Minuten bequemt sich der Monitor in den Energiesparmodus und erst panisches Rütteln an der Maus überzeugt das System davon, dass der Nutzer noch am PC ausharrt – der Monitor wird wieder geweckt.

Ich habe deshalb schon einige Abende damit verbracht, im 5-Minuten-Intervall mein Mausrad zu rollen, weil die Maus von der Couch aus noch erreichbar war und ich keine Lust hatte im Energiespar-Menü das Abschalten des Bildschirms im Leerlauf zu deaktivieren :) . Faulheit ist nicht immer ökonomisch!

Das dauerhafte Deaktivieren dieser Option ist für mich aber auch keine Alternative – ich habe keine Lust mir jedes Mal, wenn ich den PC verlasse, zu überlegen, ob es sich lohnt den Bildschirm auszuschalten oder nicht.

Das Ärgerliche bei der ganzen Sache: Totem und andere Videoplayer geben dem System einfach Bescheid: Hey, es sieht zwar aus, als sei der Nutzer untätig, aber eigentlich schaut er ein Video. Lass das mal mit dem Bildschirmschoner/Energiesparmodus. Flash bietet diesen Luxus nicht. Verschiedene Ansätze wurden daher bereits diskutiert und ich dachte, ich füge einfach mal einen weiteren hinzu:

I wanne watch this (iwwt)

IWWT ist ein kleines Python-Skript, das in festen Intervallen die Fenstertitel der Fenster auf dem Desktop auf das Vorhandensein bestimmter Zeichenketten überprüft. Findet sich also “youtube”, “google video” oder ähnliches in einem Fenstertitel, deaktiviert das Tool den Bildschirmschoner und sorgt dafür, dass der Mauszeiger nach 1 Sekunde unsichtbar wird.

Natürlich räumt das Skript hinterher auch auf: Findet sich kein entsprechender Fenstertitel mehr, wird für Bildschirmschoner und Maus wieder das Standardverhalten aktiviert.

Als kleine Erweiterung kennt das Skript noch den Schalter “-a”, mit dem nur aktive Fenster der Prüfung unterzogen werden.

Abhängigkeiten

Benötigt werden folgende Pakete:

  • python-wnck
  • unclutter

Ersteres stellt für Python eine Schnittstelle zum Fenstermanager bereit, das zweite Paket versteckt den Mauszeiger bei Untätigkeit.

Einstellungen

Das Skript kann verhältnismäßig leicht angepasst werden: In Zeile 23 ff. können die verschiedenen Fenstertitel (bzw. Bestandteile davon) eingetragen werden, bei denen der Bildschirmschoner deaktiviert werden soll. In Zeile 35 wird festgelegt, wie viele Sekunden das Skript zwischen zwei Überprüfungen warten soll, in Zeile 38 und 39 lassen sich die vom Skript aufgerufenen Programme konfigurieren.

Ecken und Kanten

Auch diese Lösung ist nicht perfekt. Sie funktioniert ausschließlich mit GNOME. Außerdem muss der Benutzer alle von ihm genutzten Video-Seiten vorher definieren.

Das 30-sekündige Pollen aller Fenstertitel ist weiterhin nicht unbedingt eine schöne Lösung. Der Timeout kann grundsätzlich aber auf x-1 Sekunden eingestellt werden (wobei x die Leerlaufzeit des Monitors bzw. Bildschirmschoners ist).

Damit man das Skript nicht jedes Mal, wenn man ein Video schauen möchte, von Hand aufrufen muss (das wäre wohl kaum eine Arbeitserleichterung), empfiehlt es sich mMn, das Skript bei der Anmeldung direkt ausführen zu lassen (System->Einstellungen->Startprogramme).

Download

iwwt.py.tar

Fenstertitel ändern

Programme wie “Titlebar Time 2” zeigen unter Windows die Zeit in der Titelleiste des Fensters an. Bei Ubuntuusers kam die Frage auf, wie sich das auch unter Ubuntu umsetzen ließe. Nach einigen Versuchen mit “wmctrl” bin ich bald auf die nützliche Bibliothek libwnck gestoßen, für die es auch eine Python-Anbindung gibt.

Ich habe das Ganze in ein Skript gegossen, das es ermöglicht, die Fenstertitel um beliebige Informationen zu erweitern – etwa die aktuelle IP-Adresse oder die Uhrzeit.

Parameter

Wird das Skript ohne weitere Parameter gestartet, zeigt es die Zeit im aktiven Fenster an. Weiterhin kennt es noch folgende Optionen:

  • -s / –seperator: Es wird eine eindeutige Zeichenkette benötigt, mit der die zusätzliche Information im Fenstertitel vom ursprünglichen Fenstertitel getrennt wird. Mit diesem Schalter kann man die entsprechende Zeichenkette verändern.
  • -a / –all-windows: Normalerweise wird nur der Fenstertitel des aktiven Fenster verändert. Wer die Fenstertitel *aller* Fenster verändern möchte, muss diese Option setzen.
  • -r / –run: Wer statt der Zeit andere Angaben im Fenstertitel zeigen möchte, kann hier entsprechende Befehle ausführen lassen – etwa “date”.
  • -t / –timeout: Dauer zwischen zwei Aktualisierungen in ms. Standard: 10.000 ms.
  • -c / –cache: Wenn eigene Befehle mit “-r” ausgeführt werden, können die Ergebnisse gecacht werden. Standard: 30.000 ms).

Um beispielsweise die aktuelle IP im Fenstertitel anzeigen zu lassen, wäre folgender Aufruf denkbar:

 ./titlechanger.py -r 'curl -s http://www.wieistmeineip.de/|egrep -o "[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+"'

Nachteile

(Achtung: Siehe Abschnit “Update”)

Da jeder Zeit Fenster geöffnet und geschlossen werden können, muss das Skript recht häufig nach Veränderungen Ausschau halten. Standard sind hier 250ms.  Das ist kein großes Problem, so lange nur die Zeit angezeigt wird. Sobald aber der Parameter “-r” ins Spiel kommt, sollte man sich vor Augen halten, dass der entsprechende Shell-Befehl alle 250ms ausgeführt wird. Mag das bei “date” noch akzeptabel sein, würde man damit beim Ermitteln der IP mittels einer externen Webseite den Anbieter 4 Mal in der Sekunde mit Anfragen belästigen. Entsprechend wurde im obigen Beispiel der Timeout auf 5 Sekunden erhöht – mit dem hässlichen Effekt, dass neue Fenster im schlimmsten Fall erst nach 5 Sekunden mit der gewünschten Angabe versehen werden.

Etwas mehr Logik im Skript könnte das Problem sicher eingrenzen. Zum Herumspielen und Experimentieren eignet sich das Skript allemal. Darüber hinaus muss jeder selbst abwägen, ob ihm modifizierte Fenstertitel die zusätzlichen Ressourcen wert sind.

Update

In der aktuellen Version des Skript (0.2) wurden viele der o.g. Probleme behoben: Das Skript erkennt, wenn das aktive Fenster gewechselt oder ein neues Fenster geöffnet wurde. Auch vom Programm veränderte Titelleisten werden jetzt erkannt. Deshalb wurde der Standard-Timeout auf 10 Sekunden angehoben.

Weiterhin wurde mit der Option “-c” ein Cache implementiert, der die Ergebnisse von Shell-Kommandos 30 Sekunden vorhält. Damit sollten dann auch Abfragen von Internetseiten kein Problem mehr darstellen.

Abhängigkeiten

Bei einer normalen Ubuntu-Installation sollte die Installation des Paketes

  • python-wnck

ausreichen.

Download

titlechangerV02.py.tar (aktuell)

titlechanger.py.tar (veraltet)

StarScale2 – Ein Bewertungs-Widget für PyGTK

Auch wenn GTK eigentlich keine Wünsche offen lässt und man Bewertungen sicher auch mit anderen Widgets realisieren kann: Bewertungen mit Sternen sind mittlerweile sehr weit verbreitet und für die Benutzer sehr intuitiv zu bedienen.

Bisher habe ich für Python nur das Widget StarHScale von Markus Mruss entdeckt, das aber in der auf dem Blog beschriebenen Variante einige kleinere Probleme hat.

Ich habe auf Basis von StarHScale nun StarScale2 erstellt – ein kleines Bewertungswidget für PyGTK. Folgende Features habe ich neu implementiert:

  • Drei verschiedene Darstellungsarten (Normal, Überlappend, halbe Sterne)
  • Automatische Anpassung an die Größe des Containers.
  • Auf Wunsch auch statische Größe.
  • Nicht-selektierte Sterne werden in Graustufen dargestellt.
  • Einfache Anpassungsmöglichkeiten der Grafiken.
  • Signal (“rating-changed” und “rating-changing”)

Das Ganze wurde noch nicht großartig getestet und hat sicher noch Ecken und Kanten. Verbesserungsvorschläge und Patches sind (wie immer) willkommen.

starscale2.tar.gz

pyConnect

Da ich in letzter Zeit doch öfter mal meinen Router neu starten musste, habe ich mich nach Möglichkeiten umgesehen, dies automatisiert zu tun. Auf dieser Seite finden sich dazu sehr einfache Skripte für dutzende von Routern.

Mit etwas Python drumherum erhält man auch direkt Rückmeldung darüber, in welchem Zustand sich die Verbindung gerade befindet:

#!/usr/bin/env python
# coding:utf-8
 
import subprocess
from pynotify import init, Notification
import sys
 
IP="192.168.2.123"
pwd="PASSWORD"
user="USERNAME"
 
# For information how to restart your router,
# visit:
#
# http://www.paehl.de/reconnect
 
init("PyConnect")
 
class main(object):
    def __init__(self):
        self.notification = None
 
    def go(self):
        self.notify(message="Loging in")
        subprocess.Popen('curl -sS "http://%s/cgi-bin/login.exe" -d "user=%s&pws=%s" 1>/dev/null' % (IP, user, pwd), shell=True).wait()
 
        self.notify(message="Disconnecting")
        subprocess.Popen('curl -sS "http://%s/cgi-bin/statusprocess.exe" -d "pvc=0&cur_if=11&disconnect.x=102&disconnect.y=5&disconnect=Reconnect" 1>/dev/null' %IP , shell=True).wait()
 
        self.notify(message="Connecting")
        subprocess.Popen('curl -sS "http://%s/cgi-bin/statusprocess.exe" -d "pvc=0&cur_if=3&connect.x=47&connect.y=10&connect=+Verbinden+" 1>/dev/null' % (IP), shell=True).wait()
 
        self.notify(message="Done")        
 
    def notify(self, title="pyConnect", message=""):
        if not self.notification:
            self.notification = Notification(title, message)
        else:
            self.notification.update(title, message)
        self.notification.show()
 
prog = main()
prog.go()

configparser gone pythonic

Zum Lieferumfang von Python gehört ja auch der ConfigParser. Mit dieser Bibliothek lassen sich Konfigurationsdateien erstellen, lesen und bearbeiten, was gerade im Linux-Umfeld ja eine durchaus nützliche Sache ist (wenngleich natürlich nicht alle Konfigurationsdateien dem selben Standard gehorchen). Wer seinen Nutzern aber schnell und unkompliziert die Möglichkeit bieten möchte, bestimmte Verhaltensweisen seines Programms zu beeinflussen, bekommt mit dem ConfigParser ein nützliches Werkzeug dazu an die Hand.

Es geht aber noch besser, wie ich gerade festgestellt habe. Mit ConfigObj lassen sich noch einfacher und pythonischer Konfigurationsdateien bearbeiten. Dazu wird die jeweilige Konfig-Datei auf ein verschachteltes Dictionary abgebildet. Ein Aufruf könnte entsprechend so aussehen:

config["Section1"] = {}
config["Section1"]["OptionA"] = “Mein Wert”

Was mir daran besonders gefällt: Statt mit irgendwelchen config.has_section(“Section1″) oder section.has_option(“OptionA”) Aufrufen fragt man ganz bequem und python-intuitiv “Section1″ in config oder “OptionA” in section und erhält die gewünschte Antwort.
ConfigObj bietet darüber hinaus natürlich noch einige Möglichkeiten, wie etwa verschachtelte Sektionen. Was mich aber besonders zum Umstieg bewogen hat, ist der Umstand, dass ConfigObj die Kommentare in den Konfigurationsdateien belässt. ConfigParser hat dahingegen die lästige Angewohnheit, Kommentare beim Schreiben und Aktualisieren von Konfigurationsdateien zu entfernen. Eine Möglichkeit, dieses Verhalten zu ändern, habe ich bisher nicht aufgetan.

Wie auch immer: Dank der intuitiven Syntax lassen sich bestehende Programme leicht auf ConfigObj migrieren. Ich konnte zumindest mit wenigen Zeilen Code meine bestehende ConfigParser-Schnittstelle auf ConfigObj umbiegen.

ooaTV

So, den ersten Ansatz meines Python/GStreamer/GTK/V4L-TV-Tools habe ich jetzt bei Launchpad unter GPLv3 veröffentlicht. Auch wenn das Programm noch in den Kinderschuhen steckt, würde ich mich über Mithilfe und Hinweise freuen.

Besonders suche ich nach einer Möglichkeit, einen Videostream, den ich mit nachfolgender Pipe aufzeichne, gleichzeitig mit einem dritten Programm abzuspielen.

gst-launch-0.10 v4l2src device=/dev/video1 ! tee name=videoout ! queue ! videorate ! video/x-raw-yuv,width=640,height=480,fps=25         ! queue  ! xvidenc bitrate=300000 ! queue ! muxout.   osssrc device=/dev/dsp ! tee name=audioout ! queue ! audio/x-raw-int,rate=44100,channels=1,width=16 ! queue ! audioconvert ! lame ! muxout.  avimux name=muxout ! identity sync=TRUE ! filesink location=video.avi

Mir ist durchaus klar, dass ich eben das mit dieser Pipe umsetzen könnte:

gst-launch-0.10 v4l2src device=/dev/video1 ! tee name=videoout ! queue ! videorate ! video/x-raw-yuv,width=640,height=480,fps=25         ! queue  ! xvidenc bitrate=300000 ! queue ! muxout.   osssrc device=/dev/dsp ! tee name=audioout ! queue ! audio/x-raw-int,rate=44100,channels=1,width=16 ! queue ! audioconvert ! lame ! muxout.  avimux name=muxout ! identity sync=TRUE ! filesink location=video.avi videoout. ! queue ! ffmpegcolorspace ! xvimagesink audioout. ! queue ! fakesink

Darum geht es aber eben nicht: Ich möchte mit GStreamer ein Video speichern und dieses – während “hinten” sozusagen noch geschrieben wird – zeitversetzt wiedergeben. Dummerweise wird der Video-Stream anscheinend von GStreamer asynchron geschrieben und erst beim Beenden mit den nötigen Meta-Daten versehen. Hier gab es Hinweise auf das identity-Element mit aktivierter Sync-Option. Allerdings war das in meinem Fall nicht hilfreich.

Update:
Da es schon ein Projekt mit dem Namen pyTV gibt, habe ich mein Programm vorerst ooaTV getauft.