lindev.fr

Aller au contenu | Aller au menu | Aller à la recherche

Mot-clé - virtualenv

Fil des billets - Fil des commentaires

15 sept. 2014

Réparer son virtualenv aprés un update Systéme/Libs

Après une belle maj de votre système, vous avez, au moment de vous remettre au travail, un sympathique message du genre

ImportError: No module named datetime

detatime !! Cette lib fait pourtant partie du standard de python ! Le fait est que lorsque l'on met à jour python, les liens utilisés à la création du venv sont hs !

Ici c'est la lib datetime qui a été remonté, mais ça peu être n'importe laquelle ..

Solution

Il ne m'a pas fallu longtemps pour résoudre ce problème tout bête, ( beaucoup de cas similaires sur le net ).

Réinitialiser le virtualenv

Par exemple avec mon venv nommé foo

virtualenv /home/cdsl/.virtualenvs/foo
New python executable in /home/foo/.virtualenvs/creasoft3/bin/python
Installing setuptools............done.
Installing pip...............done.

Et voilà ..

17 mar. 2013

Pyinotify - surveillez votre FS

monitoring_search.png Surveillez les événements de votre système de fichier sous linux grâce à Pyinotify.

Le but de cet article est de vous faire connaître ( si ce n'est déjà le cas ) un outil qui peut s'avérer bien pratique, Pyinotify, module python qui implémente inotify.

Pour vous donner un exemple d'utilisation, l'on ma demandé récemment la possibilité de notifier par mail, tout ajout de fichier/répertoire à un endroit bien précis.

C'est alors que Pyinotify module python basé sur la "feature" inotify, ( ajoutée dans le noyau linux depuis la V 2.6.13 ) entre en jeu.

Extrêmement simple à mettre en œuvre, ce module permet de surveiller une flopée d’événements sur une ou plusieurs cible(s) ( répertoire(s) ) .

Installation

Avant toute chose, il faut être certains d'être sur une distribution linux ayant au minimum un kernel >= 2.6.13 et une version de python >= 2.4

Pour vérifier :

uname -r
2.6.32-5-amd64

python -V
Python 2.6.6

C'est ok pour moi ;)

VirtualEnv ( Non obligatoire )

Pour les tests, il est conseillé de travailler avec virtualenv et virtualenvwrapper afin d'avoir un environnement "sain" sans effet de bord dû à d'autres modules python. Je ne vais pas expliquer dans ce billet comment installer ces deux outils, ( peut être dans un prochain billet ), en attendant voici une marche à suivre.

mkvirtualenv pyinotify-test

FIN de l'étape facultative --

Pyinotify

Ensuite, comme beaucoup de modules python l'installation se fera via PIP

pip install pyinotify

Humm ... rien d'autre à dire sur ce point .

Tests

Pour tester notre module fraichement installé, nous allons créer un répertoire qui sera par la suite, LE répertoire à surveiller

mkdir /home/dirmonitored

Et pour tester Pyinotify, nous allons lancer cette commande, puis effectuer des actions dans notre répertoire test ( ajout de fichiers, création de répertoires, renommage, lecture de fichier etc ... )

python -m pyinotify -v /home/dirmonitored

Vous devriez voir ce genre de choses

[2013-03-17 15:06:05,045 pyinotify DEBUG] Start monitoring ['/home/dirmonitored'], (press c^c to halt pyinotify)
[2013-03-17 15:06:05,045 pyinotify DEBUG] New <Watch wd=1 path=/home/dirmonitored mask=4095 proc_fun=None auto_add=None exclude_filter=<function <lambda> at 0xb713d80c> dir=True >
[2013-03-17 15:06:13,995 pyinotify DEBUG] Event queue size: 32
[2013-03-17 15:06:13,996 pyinotify DEBUG] <_RawEvent cookie=0 mask=0x100 name=indamix wd=1 >
<Event dir=False mask=0x100 maskname=IN_CREATE name=indamix path=/home/dirmonitored pathname=/home/dirmonitored/indamix wd=1 >
[2013-03-17 15:06:13,996 pyinotify DEBUG] Event queue size: 32
[2013-03-17 15:06:13,996 pyinotify DEBUG] <_RawEvent cookie=0 mask=0x20 name=indamix wd=1 >
<Event dir=False mask=0x20 maskname=IN_OPEN name=indamix path=/home/dirmonitored pathname=/home/dirmonitored/indamix wd=1 >
[2013-03-17 15:06:13,996 pyinotify DEBUG] Event queue size: 32
[2013-03-17 15:06:13,997 pyinotify DEBUG] <_RawEvent cookie=0 mask=0x4 name=indamix wd=1 >
<Event dir=False mask=0x4 maskname=IN_ATTRIB name=indamix path=/home/dirmonitored pathname=/home/dirmonitored/indamix wd=1 >
[2013-03-17 15:06:13,997 pyinotify DEBUG] Event queue size: 32
[2013-03-17 15:06:13,998 pyinotify DEBUG] <_RawEvent cookie=0 mask=0x8 name=indamix wd=1 >
<Event dir=False mask=0x8 maskname=IN_CLOSE_WRITE name=indamix path=/home/dirmonitored pathname=/home/dirmonitored/indamix wd=1 >
[2013-03-17 15:06:56,626 pyinotify DEBUG] Event queue size: 32
[2013-03-17 15:06:56,626 pyinotify DEBUG] <_RawEvent cookie=0 mask=0x40000100 name=new wd=1 >
<Event dir=True mask=0x40000100 maskname=IN_CREATE|IN_ISDIR name=new path=/home/dirmonitored pathname=/home/dirmonitored/new wd=1 >
[2013-03-17 15:06:56,627 pyinotify DEBUG] Event queue size: 32
[2013-03-17 15:06:56,627 pyinotify DEBUG] <_RawEvent cookie=0 mask=0x40000100 name=rep wd=1 >
<Event dir=True mask=0x40000100 maskname=IN_CREATE|IN_ISDIR name=rep path=/home/dirmonitored pathname=/home/dirmonitored/rep wd=1 >

Bien maintenant que nous sommes certains que cela fonctionne, nous allons pouvoir créer un petit script pour surveiller notre répertoire et agir aux événements souhaités.

main.py

Commençons par créer notre fichier principal, et voici son contenu

#!/usr/bin/python
#-*- coding:utf-8 -*-


import pyinotify

wm = pyinotify.WatchManager() # Watch Manager
mask = pyinotify.IN_MOVED_TO | pyinotify.IN_CREATE    # watched events
directory = '/home/dirmonitored'


class EventHandler(pyinotify.ProcessEvent):


    def process_IN_MOVED_TO(self, event):

        if event.dir:
            print "Copie de répertoire :", event.pathname
        else:
            print "Copie de fichier :", event.pathname

    def process_IN_CREATE(self, event):

        if event.dir:
            print "Création de répertoire :", event.pathname
        else:
            print "Création de fichier :", event.pathname


handler = EventHandler()
notifier = pyinotify.Notifier(wm, handler)
wdd = wm.add_watch(directory, mask, rec=True, auto_add=True)

notifier.loop()

Voici les grandes étapes du code ci-dessus:

  1. importation du module pyinotify
  2. Création du "manager" pyinotifi
  3. Déclaration des Événements à surveiller
  4. Déclaration du répertoire à surveiller
  5. Création de la classe qui va gérer les actions en fonction des événements levés
  6. Code à exécuter si l’événement IN_MOVED_TO est remonté
  7. Code à exécuter si l’événement IN_CREATE est remonté
  8. Mise en relation de notre Manager / Gestionnaire d’événements
  9. Ajout du répertoire à surveiller de façon récursive, sur le masque d’événements "mask" avec l'activation automatique de la surveillance des nouveaux répertoires crées.
  10. Démarrage du monitoring

Testons ce bout de code

python main.py

Et voilà ce que ça donne après avoir créé un répertoire et un fichier dans notre directory surveillé

(pyinotify-test)[email protected]:~$ python main.py 
Création de fichier : /home/dirmonitored/Nfichier
Création de répertoire : /home/dirmonitored/Ndirectory

Les actions de notre script ci-dessus ne fait qu'afficher un message, mais vous pouvez y coller n'importe quoi d'autre ( notification pas mail, impression, traitement du fichier puis déplacement .. etc .. ) bref Pynotify peut être utilisé pour beaucoup de choses .

Sources

Le dépôt Pyinotify API Pyinotify

Conclusion

Pyinotify , un module python à mettre entres toutes les mains, développeurs ou administrateur système .