Exécuter du code à tout lancement de Python


Je vous avais montré comment lancer du code au démarrage du shell iPython, et on peut faire quelque chose de similaire pour le shell Python ordinnaire avec la variable d’environnement PYTHONSTARTUP:

export PYTHONSTARTUP=/chemin/vers/fichier/python/a/executer/au/demarrage.py

Mais comment lancer du code au démarrage pour Python quand on est PAS dans un shell ?

Comme pour l’exécution du code à la fermeture de la VM, il existe bien entendu un mécanisme pour cela.

Ouvez un shell, et tapez:

>>> import site
>>> site.getusersitepackages()
'/home/sam/.local/lib/python2.7/site-packages'

Vous obtenez ainsi le dossier des sites packages locaux, c’est à dire un dossier qui est dans le PYTHON PATH, mais uniquement pour l’utilisateur courant. Donc vous pouvez mettre dedans toute bibliothèque Python que vous voulez importable de partout, mais uniquement pour vous.

Dans ce dossier, créez un fichier nommé usercustomize.py, et voilà ! Tout ce qui est dans ce fichier est automatiquement exécuté au démarrage de Python.

Attention cependant, il est exécuté très tôt, et donc certaines choses ne sont pas encore chargées, telle que sys.argv ou __builtin__.

Il faut donc ruser un peut. Si vous êtes une loque qui n’aime pas taper import ipdb; ipdb.set_trace(), vous pouvez par exemple mettre dedans :

import __builtin__
 
from pdb import set_trace
 
__builtin__.set_trace = set_trace

Et maintenant, dans votre code, vous pourrez appeler set_trace() de pdb directement, sans import, sans préfixe.

Attention tout de même à ce que vous allez mettre là. Si vous commencez à trop trafiquer votre installation, vos programmes pourraient marcher dessus et pas ailleurs. Testez toujours vos logiciels sur des installations de Python standards.

Bonus point: le code de startup d’un codeur Python scientifique.

16 thoughts on “Exécuter du code à tout lancement de Python

  • kontre

    Un codeur python scientifique qui n’importe pas numpy par défaut ? c’est qui ce rigolo ?

    Au passage, ce qui est fait pour python se fera aussi pour ipython, du coup ?

  • Emmanuel

    On peut être développeur “scientifique” Python et préférer développer ses propres librairies de calculs en C puis de les interfacer avec Python par l’intermédiaire de ctype.

  • kontre

    Oui, on peut. Et pour ça on utilise des formats de données compatibles. Genre, des tableaux numpy. Sinon, je ne vois pas l’intérêt de passer par python…
    Bon, y’a peut-être des cas extrêmes où un scientifique n’utiliserait que le module math, mais ça m’étonne plus que fortement.

  • Sam Post author

    Nan mais tous les scientifiques font pas des calculs qui ont besoin de scipy, faut pas déconner. Tout scientifique n’a pas forcément besoin de grosses maths, et toute science n’est pas uniquement que calculs avancés.

  • Emmanuel

    C’est tout à fait ça, Sam. Sinon, il n’y a aucun intérêt à préférer Python+Numpy à Scilab par exemple ou bien Octave. Pour donner un exemple, des modélisations par Monté Carlo sont plus efficaces avec le couple Python ctype que par l’utilisation de Numpy (je le vis tous les jours).

  • kontre

    scipy, non, je l’utilise très peu moi aussi. Par contre quand je veux un tableau de données, même pour faire des additions, je prends numpy direct. (pour ceux qui ne savent pas, numpy est la lib de base avec les formats de données et les fonctions basiques, et scipy se base sur numpy en rajoutant plein de fonctions supplémentaires assez spécialisées)
    Après, on peut utiliser python comme calculatrice avancée, mais j’appelle plus ça un codeur Python scientifique. (passer pour un connard élitiste : check)

  • Sam Post author

    Au passage, si quelqu’un se sent chaud pour faire 2, 3 tutos pour débutant sous numpy et scipy, je suis preneur (même si c’est pas en article invité). Car je me sens toujours très con aux formations avec des mecs qui les utilise n’y connaissant rien, et les tutos sont très axés “usages scientifiques” alors que moi je suis interessé par “ce que la lib peut faire”.

  • kontre

    D’ici une 20aine d’années, mes enfants devraient me laisser le temps de faire ça… Plus sérieusement, ça m’intéresse de faire un truc comme ça, je vais voir si je peux caser ça un soir.
    Tu peux préciser la dernière phrase ? Tu veux dire que les tutos ne présentent que des applications à un domaine spécifique, et pas la lib en général ?

    Edit @Emmanuel: et numpy+cython, c’est pas plus simple et aussi performant que python+ctypes ? (question ouverte, hein)

  • Sam Post author

    Exactement. Généralement les tutos c’est “comment faire une une extrapolation transmogrifienne des plans mongroviens élliptiques avec scipy”, et pas “cette lib à tels types, telles méthodes, telles fonctions, et on peut faire ça et ça avec et elle est bien pour ça parceque x et nulle pour ça parceque x”.

  • Andy

    J’importe site.

    Je récupère le chemin ‘C:\\Users\\aandy\\AppData\\Roaming\\Python\\Python35\\site-packages’.

    Je fait afficher les dossiers cachés (pour AppData).

    Le dossier python n’existe pas. Je créer les 3 dossiers (Python, Python35 puis site-packages).

    Je créer usercustomize.py avec à l’intérieure

    print("Bonjour Andy !")

    Je sauvegarde puis je lance un shell.

    Rien ne s’affiche. Python ne me dit pas bonjour et garde sa fameuse ligne ennuyeuse

    Python 3.5.1 (v3.5.1:37a07cee5969, Dec 6 2015, 01:38:48) [MSC v.1900 32 bit (Intel)] on win32

    Type "copyright", "credits" or "license()" for more information.

    Je suis déçu.

    Je me dit que ce fichier ne sert qu’a importer des modules. Donc je rajoute dans le fichier import arrow.

    Je lance le shell et je tape arrow :

    >>> arrow

    Traceback (most recent call last):

    File "<pyshell#0>", line 1, in

    arrow

    NameError: name 'arrow' is not defined

    ça semble tout simplement ne pas fonctionner. Qu’es-ce qui ne vas pas ?

  • Sam Post author

    Aucune idée. Supprime les dossiers créés. Fait un “pip install peewee –user” et voit si ça apparait dedans.

  • Andy

    Ok alors en faite ça fonctionne avec un CMD (Je suis sur Windows) mais pas avec Idle.

    Python me dit bien bonjour. Par contre arrow n’est toujours pas importable.

    Une idée ?

  • Sam Post author

    Pour idle non. Peut être que tu as plusieurs Python installé sur l’ordi et que idle en utilise une autre. Pour l’import, lis la parti __builtin__ sur l’article.

  • Andy

    Effectivement, j’ai python 2.7 et 3.5.

    C’est bon j’ai compris. Sur python 3.5, il faut remplacer __builtin__ par builtins.

    Et pour Idle, l’import fonctionne bien mais le texte n’est pas affiché. Mais bon … ça fonctionne sur Pycharm!

    Merci Sam.

Comments are closed.

Des questions Python sans rapport avec l'article ? Posez-les sur IndexError.