Sept petites libs qui changent la vie d’un dev Python

Toutes ces libs sont, bien entendu, installables avec pip.

Clize

optparse est deprecated, argparse est imbuvable et sys.argv limité. Avant de vous tirer une balle dans la tête au moment de parser les arguments passés à votre script:

pip install clize

Et voilà, définir des paramètres est aussi simple qu’écrire une fonction:

import clize
 
@clize.clize()
def main(argument_obligatoire, argument_optionel="valeur_par_defaut"):
    """
        La docstring est transformée en message d'usage.
    """
    print argument_obligatoire, argument_optionel
 
 
if __name__ == "__main__":
    clize.run(main)

Votre programme accepte maintenant --argument-obligatoire et --argument-optionel qui seront automatiquement passés à la fonction. --help affichera les options et la docstring.

On peut faire bien plus avec clize: caster les arguments, créer des subcommandes, etc.

Dateutil

Contrairement à Max, j’adore la gestion des dates en Python. Mais dateutil la propulse au niveau supérieur:

pip install python-dateutil

Et hop:

>>> from dateutil import relativedelta
>>> import datetime
>>> datetime.datetime.now() + relativedelta.relativedelta(months=+3, weeks=-1, hours=+1.5)
>>> datetime.datetime(2012, 9, 13, 14, 49, 17, 375017)

Ouai.

Dateutil vient avec tout un tas de goodies comme la gestion des timezones ou des raccourcis pour répondre à des questions existentielles telle que savoir si le 3 mars dans 6 ans sera un jeudi.

Requests

Urllib, ça va 5 minutes. Ca vous dit une API simplissime pour faire des requêtes ?

pip install requests
>>> import requests
>>> requests.post('http://urldelamortquitue.com/magicform/', {u'champ1':u"valeur1", u'champ2':u"valeur2"})

requests gère automamagiquement l’encoding, l’escaping, les cookies, le suivie des redirections et les embouteillages du périph les jours impaires. On peut facilement modifier les headers et cookies, faire des authentifications HTTP, des requêtes HEAD, GET, OPTIONS, PUT, FINGER, NOSE, ASS, ETC.

Bottle

Besoin de monter un mini site Web en 5 minutes ? Bottle est un micro framework Web qui tient en un fichier.

pip install bottle

Et dans un fichier monsite.py:

from bottle import Bottle, run, static_file, view
 
app = Bottle()
 
# une page d'acceuil statique
@app.route('/')
@view('home')
def index():
    return {}
 
# une page de formulaire
@app.route('/truc/create', method='POST')
def create_truc():
    nom_du_truc = request.forms['name']
    # ici faire un machin avec le truc
    return {'name': nom_du_truc}
 
# afficher un truc en particulier
@app.route('/truc/:truc_id')
@view('truc')
def display_truc(truc_id):
    truc = getTrucFromTrucId(truc_id)
    return {'truc': truc}
 
# servir les fichiers statiques
@app.route('/static/<filename:path>')
def server_static(filename):
    return static_file(filename, root='/chemin/vers/dossier/des/fichiers/statiques')
 
if __name__ == "__main__":
    run(app)

On met les templates dans le sous dossier “views” et les css dans “/chemin/vers/dossier/des/fichiers/statiques/css” et
on a un mini site Web qui tourne:

python monsite.py

C’est ce qui fait tourner 0bin.

Peewee

Un ORM qui tient dans un mouchoir de poche, fabuleux pour attaquer une base de données PosGres, MySql ou Sqlite sans avoir à sortir l’artillerie lourde:

pip install peewee

Il y a plusieurs syntaxes pour décrire ses modèles et faires ses queries. L’une d’elles ressemble à celle de l’ORM Django:

import peewee
from sqlite import OperationalError
 
# exemple avec sqlite
DATABASE_CONNECTION = peewee.SqliteDatabase('/chemin/vers/db.sqlite')
 
class BaseModel(peewee.Model):
    class Meta:
        database = DATABASE_CONNECTION
 
class Truc(BaseModel):
    name = peewee.CharField(max_length=256)  # un champ text limité à 256 chars
    description = peewee.TextField(null=True) # un blob de text de taille illimitée
    last_update = peewee.DateTimeField(null=True) # un champ date qui peut être nul
 
class Bidule(BaseModel):
    name = peewee.CharField(max_length=64, help_text=(u"Le nom du bidule"))
    truc = peewee.ForeignKeyField(Truc, related_name='bidules') # chaque bidule est lié à un truc
    valid = peewee.BooleanField(default=False) # un champ vrai/faux
 
for model in (Truc, Bidule):
    try:
        model.create_table()
    except OperationalError:
       pass

A l’usage:

print "Nombre de trucs: %s" % Truc.select().count()
bidules_du_truc_cool = Truc.get(name="cool").bidules
 
for bidule in bidules_du_truc_cool:
    print bidule.name
    bidule.valid = True
    bidule.save()

Beautiful soup

En a déjà parlé mais comme parser du HTML à la main est une plaie, il faut absolument citer cette lib dans cet article.

pip install beautifulsoup

Récupérer toutes les URL des balises scripts qui sont dans le tag HEAD:

head = BeautifulSoup(html).find('head')
links = []
for link in head.findAll('link'):
    href = dict(link.attrs).get('href', '')
    if href:
        links.append(link.attrs)

paramiko

Se connecter en SSH à un serveur et éxécuter des tâches à distance n’a jamais été aussi facile:

pip install paramiko

Paramiko permet entre autres de se connecter à un serveur en SFTP et donc de d’uploader ou de télécharger des fichiers sur celui-ci:

transport = paramiko.Transport(("88.19.blablabla", "22"))
transport.connect(username="foo", password="bar")
connection = paramiko.SFTPClient.from_transport(transport)
 
local_file, remote_path = "/chemin/vers/fichier"
local_file = open(local_file)
 
try:
    connection.open(remote_path, 'wb').write(local_file.read())
finally:
    for x in (connection, transport, local_file):
        x.close()

C’est la lib qu’utilise fabric.

No related posts.

flattr this!

28 comments

  1. Bonjour,

    Comment se situe Clize par rapport à Argh ? (http://packages.python.org/argh/)

  2. En parlant d’ORM léger, j’ai bricolé ça: https://github.com/desfrenes/PyBean

    ça marche pour sqlite et ça s’occupe de créer le schéma à la volée, dans l’esprit de ce que fait redbeanphp.

  3. @desfrenes

    Clize fait à peu prêt la même chose que Argh, mais à l’usage j’ai trouvé Clize plus intuitif, et le code tient dans un tout petit fichier.

  4. François

    Merci, je vais pouvoir améliorer mes codes :)

  5. Wow un mec de l’april ?

    Bienvenu :-) J’adore ce que vous faites. Je suis donateur. Longue vie à l’APRIL, tout ça.

  6. S&M toujours aussi intéressant.

  7. oui, je suis de l’April :)

    Merci de nous encourager, c’est cool.

  8. C’est vraiment génial Python ! Je n’y connais rien dans ce langage, mais son nom est *sur* et *dans* tous les projets informatiques que je lorgne çà et là…

    En plus, la syntaxe est visiblement réussie et les “piles incluses” excellentes :) Grâce à vous, je carbure au python -m "SimpleHTTPServer" pour tester mon site en local… mais ça ne fonctionne pas avec php…

  9. Pour les arguments, il y a également http://docopt.org/ qui dispose d’une implémentation Python.

    Au niveau des petites libs sympa il y a aussi http://httpie.org

    (si vous utilisez fabric, ne pas oublier de jeter un œil à fabtools et fabulous)

  10. “mais ça ne fonctionne pas avec php…”

    php -S localhost:80

  11. Ouah cool. Merci beaucoup !

    Clize est une super bonne idée. Maintenant que je l’ai sous les yeux, je me rends compte que y’avait effectivement un manque, pour un problème aussi con que la récupération d’arguments.

    Sinon, comme librairie top classe, j’aime bien logging.
    – Formatage de message de log.
    – Définition de niveaux (error, warning, info, blabla, …)
    – Emission vers stdout, fichier texte, mail, etc.
    – Thread safe
    – Morceau de brennek rôti.

  12. @desfrenes et @Recher: Attention avec PHP -S, c’est un ajout très récent (PHP 5.4.0) et donc n’est pour l’instant pas disponible partout. Par exemple le PHP des dépots de la dernière Ubuntu (Precise Pangoline) est en version en 5.3. Inutile de dire que les hébergeurs ne seront pas à jour de si tôt.

    Néanmoins si vous utilisez un framework PHP (comme Symphony ou CakePHP), il y a fort probablement un server de dev fourni avec comme c’est le cas pour Django et Bottle en Python

  13. @sam: dotdeb est là pour ça: http://www.dotdeb.org/instructions/

    quant au fait que les hébergeurs ne soient pas à jours… étant donné que cette feature n’a d’intérêt qu’en développement ce n’est pas bien grave :-)

  14. Pas exactement. En fait un serveur de dev est un moyen fabuleux de débugger en ligne sur un autre port en 2 secondes un problème en prod qu’on ne peut débugger en local. Ca permet de faire le debuggage sans perturber l’expérience utilisateur, et même activer les modes DEBUG sans que ça se voit, voir carrément tester 4 setup avec 4 settings différents sur 4 autres ports en parallèle. Ces petits serveurs de dev sont fabuleux.

    Excellent pour dotdeb, je connaissais pas.

  15. C’est pas une mauvaise idée effectivement.

    Pour les frameworks, à ma connaissance il n’y a pas de framework php qui fournisse son serveur de dev, pas avant php5.4, même si on connait des projets visant à faire un serveur web en php (à grands coups de pcntl souvent).

  16. Moi chui du mois de Mai mais je pense que tout le monde s’en fout…

  17. Mais qu’il est con ce max !

  18. Sébastien

    paramiko est un peu en cours d’abandon. Mais vive ssh, le nouveau module ssh pour python qui est un fork de paramiko :

    http://wiki.python.org/moin/SecureShell

  19. Sinon il y a aussi lxml pour parser du HTML facilement (et plus rapidement que BeautifulSoup apparemment)
    En tout cas il semble beaucoup mieux gérer le HTML malformé d’après mes tests

    Sinon merci pour Bottle, faut que je teste!

  20. lxml ne gère pas du tout le HTML. Il gère le xml. Du coup pour tout ce qui est HTML 4 et HTML 5, lxml est à la ramasse, surtout sur du mal formé.

  21. @Sam: tu y vas un peu fort avec lxml en disant qu’il ne gère pas du tout le HTML..

    Je l’utilise pour quelques tools pour parser des pages HTML et exécuter des query XPATH. Je n’ai jamais eu de problème :).

  22. C’est parce que tu travaille sur des pages bien formées (ou du xHTML). Mais parser des pages en HTML4 ou 5 fait avec la méthode rache, ça pardonne vachement moins.

  23. @sam: C’est fort probable. Je check ce soir.

    Dans tous les cas, c’est tout de même possible et, au moment ou j’ai fais mes scripts (2/3 ans), c’était bien pratique pour effectuer des requêtes XPATH non gérées par Beautiful Soup (c’est le cas maintenant ?).

  24. Je ne crois pas.

  25. Etienne

    C’est peut-être un peu hors sujet, mais j’ai un problème ennuyeux avec peewee. Y’a quelqu’un qui peut me dire où je peux poster ça?

    J’ai posté sur google groups, mais c’est un peu mort…

  26. Si c’est un bug: sur le bug tracker de peewee (je pense qu’il est sur github). Si c’est une demande d’aide, sur le forum de l’afpy pour du fr, et sur stackoverflow pour du en de haut niveau.

  27. Waaaa! Grace à vous, je découvre Clize, et ça me fout la larme à l’oeil!! J’attendais ça depuis si longtemps!

    http://www.youtube.com/watch?v=Zu8dtg6bvKE

    P.S: “Contrairement à Max”

  28. D’ici un an ou deux, on aura éradiqué toutes les fautes de tous les articles, mouahahaha !

    Après on s’attaquera aux comments.

    Nan je déconne…

Trackbacks/Pingbacks

  1. Sept petites libs qui changent la vie d’un dev Python | Sam & Max » Quality and security of information systems - [...] Sept petites libs qui changent la vie d’un dev Python | Sam & Max [...]
  2. Executer une commande sur un serveur distant via ssh | Sam & Max: Python, Django, Git et du cul - [...] a plusieurs manières d’executer une commande shell sur un serveur distant, on peut utiliser paramiko ou un simple popen ...

Flux RSS des commentaires

Leave a Reply

Your email address will not be published. Required fields are marked *

*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="" escaped="" highlight="">

Jouer à mario en attendant que les autres répondent