Archiv für die Kategorie ‘Python’

h1

Sqlite dump exportieren

Mai 10, 2009

Ich bin gerade dabei meine Test Sqlite Datenbank von Django zu exportieren um eine MySQL Datenbank auf dem Production Server benutzen zu können. Dafür musste ich ein Sql Dump erstellen der Sqlite3 Datei:

charly@lucy:~/py/django$ sqlite3 database.db .dump .quit >> database_dump.sql

Die Punkte vor „dump“ und „quit“ gehören dazu.


h1

Python Shell Einzeiler

Februar 18, 2009

Wenn ich mit der Shell arbeite mag ich am liebsten die Einzeiler. Ich weiß zwar noch nicht, ob das wirklich nützlich ist, aber eben gerade habe ich gelesen wie man Python als Einzeiler ausführt:

charly@lucy:~$ python -c ‘print „Hello World“‘

Wenn sowas jemanden interessiert, dann kann er sich auch hier: http://www.rosettacode.org/wiki/Shell_One_Liner den Spaß in einer ganzen Reihe von Programmiersprachen angucken. Am aller besten finde ich das Beispiel in C:

charly@lucy:~$ touch /tmp/T0.c /tmp/T && chmod 600 /tmp/T0.c /tmp/T && echo -e „#include<stdio.h>\nint main(){printf(\“Hello\\\n\“);return 0;}“ >/tmp/T0.c &&
>   gcc /tmp/T0.c -o /tmp/T && /tmp/T && rm -f /tmp/T0.c /tmp/T
Hello

h1

Ein paar Verändungen und mehr

Februar 8, 2009

Wie man unschwer sehen kann, haben wir unserem Blog ein neues Theme verpasst. Zum Einen, weil immer mehr Unzufriedenheit über das alte Theme aufkam und zum Anderen, weil wir ein individuelles Logo wollten, dass zum alten Theme nicht passte. Das ist aber erst der Anfang der Veränderungen.

Jetzt, wo wir zu fünft sind und der Blog sich doch einiger Besucher erfreut, arbeiten wir an einem etwas größeren Projekt. Zusammen wollen wir uns in Python mit Django eine eigene Blog-Software schreiben, da wir uns hier bei WordPress ziemlich gefangen fühlen. Allerdings befindet sich das ganze Projekt noch im Anfangsstadium und man wird sich noch eine ganze Weile gedulden müssen.

Bis dahin erscheinen hier natürlich weiterhin neue Artikel und wir hoffen auf viele Leser und deren Kommentare. =)

h1

Programmausgabe in Variable speichern Python

Februar 7, 2009

Die Ausgabe von einem Programm oder einem Prozess in einer Variable zu speichern ist in Python gar nicht so leicht, wie man das zuerst erwarten würde. Benutzen sollte man dafür das subprocess Modul, da os.system() nicht nur deprecated ist, sondern auch nicht sehr flexibel. Es gibt jegliche Ausgabe nämlich einfach auf der stdout aus. Besser geht es dagegen mit subprocess.Popen():

1 from subprocess import Popen, PIPE
2
3 output = Popen(„fortune„, stdout=PIPE).communicate()[0]
4 output = Popen(["programm", "argument"], stdout=PIPE).communicate[0]

Weitere Infos zu subprocess gibt es hier: http://docs.python.org/library/subprocess.html

h1

Django 1.0 und django-tagging

Februar 3, 2009

Wer seinem Django Projekt eine gute App fürs Tagging hinzufügen möchte, hat sicher schon einmal etwas von django-tagging gehört.

Falls nicht: Django-tagging ist ein kleines Framework, welches das Arbeiten mit Tags innerhalb einer Django-Applikation verbessern soll. Es werden Funktionen bereitgestellt, wie das Erzeugen einer Tagcloud, das Browsen von Einträgen nach Tags und einiges mehr. Klingt gut oder? So wer sich nun denkt „ruck-zuck“ runtergeladen fertig…sollte lieber aufpassen. Denn ungünstigerweise arbeitet die aktuelle Version, welche auf der Projektseite angeboten wird, nicht mit Django 1.0 zusammen. Lediglich die Version im trunk, welche ihr euch per svn laden könnt, ist auf dem aktuellen Stand. Gut also das Ganze mit dem unten auf der Seite angegebenen checkout runterladen (hier ist folgendes zu beachten: falls euer Django-Projekt sich auch in einer svn Versionskontrolle befindet, ist es nicht sinnvoll das checkout für django-tagging innhalb dieses Arbeitsverzeichnisses durchzuführen <– Notiz an mich selbst xD).
So, nachdem ihr alles enpackt habt und mit Superuser Rechten das setup.py Skript ausgeführt habt,

sudo python setup.py install

könnt ihr nun das Verzeichnis tagging unter build/lib/ in euer Djangoprojekt einfügen.

Als nächstes solltet ihr django-tagging in der settings.py unter INSTALLED_APPS hinzufügen (hier ist darauf zu achten, auch ein Unterverzeichnis anzugeben, falls ihr den Ordner tagging in ein solches gelegt habt).

‘deinProjekt.tagging’,

Nun könnt ihr auch schon eure models.py in der gewünschten App bearbeiten.

from django.db import models
from tagging.fields import TagField
from tagging.models import Tag

class BlogPost(models.Model):

    title = models.CharField(max_length=30)
    body = models.TextField()
    date_posted = models.DateField(auto_now_add=True)
    tags = TagField()

    def set_tags(self, tags):
        Tag.objects.update_tags(self, tags)

    def get_tags(self, tags):
        return Tag.objects.get_for_object(self)

Dabei müsst ihr auch wieder auf die include-Pfade achten, falls ihr tagging in einem Unterverzeichnis zu liegen habt.
So, nachdem ihr diese Models erstellt habt, könnt ihr „syncdb“ ausführen und schon sollte alles funktionieren.

ACHTUNG: Falls ihr schon eine bestehende Datenbank habt, wird Django die Änderungen an den Models nicht übernehmen. Um das zu erreichen tut ihr folgendes:

$ python manage.py dbshell

> ALTER TABLE deineApp_deinModel ADD COLUMN tags varchar;

Danach sollte alles soweit funktionieren. Zur Funktionalität von django-tagging werde ich mich jetzt nicht auslassen.
Dazu könnt ihr zum Beispiel hier nachlesen.

h1

Django Cheatsheet

Januar 29, 2009

Hab gerade eine recht nützliche Übersicht, bestehend aus 2 A4 Seiten, über Django gefunden. Es ist vielleicht nicht der Renner, aber einen Blick auf jeden Fall wert:

http://www.mercurytide.co.uk/news/article/django-cheat-sheet/

h1

XChat Plugins/Scripte

Januar 12, 2009

Da ich jetzt ab und zu auch mal im IRC mit XChat herumlunger, habe ich mal nachgeschaut, wie man sein XChat noch weiter anpassen und konfigurieren kann. Dabei bin ich darauf gestoßen, dass es Schnittstellen für 8 verschiedene Script- bzw. Programmiersprachen gibt (z.B. Python, Perl, C/C++).

Man kann sich also ein kleines Modul schreiben, dass dann auf bestimmte Nachrichten reagiert und vieles mehr – ok, so genau weiß ich es noch nicht =P

Die Dokumentationen und ein Überblick über die verfügbaren Implementierungen gibt es hier.

Und hier gibt es sogar einen ganzen Forumsbereich über XChat-Plugins und  Scripten.

h1

Kochbuch für alle Programmiersprachen (zb Python, Perl, Ruby, Groovy)

November 20, 2008

Okay, alle ist etwas übertrieben, aber interessant ist das „Pleac Project“ allemal, was soviel heißt wie „Programming Language Examples Alike Cookbook“. Ausgehend von dem Perl Kochbuch, wurden Programmbeispiele in diverse Programmiersprachen übersetzt. Noch kann auch mitgearbeitet werden, viele Sprachen sind erst zu einem kleinen Teil fertig. Allerdings gibt es ein vollständiges Perl Kochbuch online und ein nahezu vollständiges Python Kochbuch. Am besten ihr werft selbst einen Blick drauf.

>>http://pleac.sourceforge.net/

Diese Seite gehört von nun an definitiv zu meinen Standardonlinenachschlagewerken (was für ein Wort).

h1

createscript.py – hashbang + set executable + edit + execute

November 16, 2008

Da mir aufgefallen ist, dass ich relativ oft eine Datei erstelle, dann in vim editiere, die hashbang-Zeile manuell einfüge, danach noch die Datei auf executable setze und sie dann ausführe, habe ich mir ein kleines Script geschrieben, welches mir diese Aufgabe abnimmt.

Die Benutzung sieht wie folgt aus:

[thomas@jane ~/progs/python/test]$ ./createscript.py

USAGE: ./createscript.py filename [...]


[thomas@jane ~/progs/python/test]$ ./createscript.py test.pl

– Erstellt die Datei test.pl und fügt ihr die Hashbang-Zeile #!/usr/bin/perl zu, setzt das executable-Flag, startet vim mit der Datei als Argument und führ die Datei nach Beendigung von vim aus.  –

[thomas@jane ~/progs/python/test]$ ./createscript.py test.pl test.py blubb

– Erstellt die Dateien test.pl und test.py mit den dafür im Quellcode vorgesehen Hashbang-Zeilen und erstellt die Datei blubb ohne Shebang Zeile. Öffnet anschließend alle Dateien in vim, mit getrennten (vim-) Fenstern. Danach setzt es noch das executable-Flag und führt die Dateien aus. –

Die Hashbang-Zeilen werden anhand der Dateiendungen ermittelt.

Und hier zum Download ohne Zeilennummern.

h1

Googlemail File Upload Skript

November 12, 2008

Angeregt durch das Bilder Upload Skript von Crackpod bin ich auch auf die Idee gekommen, eine Erweiterung für den Nautilus Datei Manager zu schreiben, mit der man per Mausklick Dateien sich selbst per Mail schicken kann. Dafür benutze ich meinen Googlemail Account, um von überall aus auf bestimmte Dateien zugreifen zu können.

Ihr könnt damit also per Rechtsklick auf eine Datei oder einen Ordner klicken und es dann hochladen lassen, ohne extra euer Mail Programm zu benutzen. Das sieht dann ungefähr so aus:

gmailuploadfile

Bei dem Skript müsst ihr nur eure Emailadresse einfügen, euren Usernamen (meist der Teil vor dem @) und euer Passwort. Wollt ihr nicht Googlemail benutzen, dann ändert einfach die Smtpadresse.

#!/usr/bin/python

# Script to send a File to my own Gmail Account
# Used as a Nautilus Script
# May also be used from command line or vim
import sys, smtplib, os
from email.MIMEMultipart import MIMEMultipart
from email.MIMEBase import MIMEBase
from email.MIMEText import MIMEText
from email.Utils import formatdate
from email import Encoders

# Helper Function
class folderToTarGz(object):
  nameExtension = 'gmailSendFile.tar.gz'

  def makeTarGz(self, folderName):
    import tarfile
    self.folderName = folderName
    tar = tarfile.open(folderName + self.nameExtension, 'w:gz')
    tar.add(folderName)
    tar.close()
    return folderName + self.nameExtension

  def cleanUp(self):
    import os
    os.remove(self.folderName + self.nameExtension) 

class GmailSendFile(object):
  mailadress = 'muster.mann@gmail.com'
  smtpserver = 'smtp.googlemail.com'
  username = 'muster.mann'
  password = 'secret'

  def send(self, files):
    # Gather information, prepare mail
    to = self.mailadress
    From = self.mailadress
    if len(files) <= 3: subjAdd = ','.join(files)
    if len(files) > 3: subjAdd = ','.join(files[:3]) + '...'
    subject = 'Dateiupload: ' + subjAdd
    msg = self.prepareMail(From, to, subject, files)

    #Connect to server and send mail
    server = smtplib.SMTP(self.smtpserver)
    server.ehlo() #Has something to do with sending information
    server.starttls() # Use encrypted SSL mode
    server.ehlo() # To make starttls work
    server.login(self.username, self.password)
    failed = server.sendmail(From, to, msg.as_string())
    server.quit()

  def prepareMail(self, From, to, subject, attachments):
    msg = MIMEMultipart()
    msg['From'] = From
    msg['To'] = to
    msg['Date'] = formatdate(localtime=True)
    msg['Subject'] = subject

    # The Body message is empty
    msg.attach( MIMEText("") )

    for file in attachments:
      #Is Folder?
      packed = False
      if os.path.isdir(file):
        packer = folderToTarGz()
        file = packer.makeTarGz(file)
        packed = True

      #We could check for mimetypes here, but I'm too lazy
      part = MIMEBase('application', "octet-stream")
      part.set_payload( open(file,"rb").read() )
      Encoders.encode_base64(part)
      part.add_header('Content-Disposition', 'attachment; filename="%s"' % os.path.basename(file))
      msg.attach(part)
      #Delete created Tar
      if packed: packer.cleanUp()
    return msg

if __name__ == '__main__':
  gmail = GmailSendFile()
  gmail.send(sys.argv[1:])

Hier könnt ihr das Script downloaden.

Um das Skript zu installieren, speichert es einfach in einer Datei, macht es ausführbar:

$ sudo chmod +x gmailFileUpload.py

und speichert es im Pfad: ~/.gnome2/nautilus-scripts.

Viel Spaß damit!