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.
Au passage, j’ai appris récemment que ipdb était aussi (et apparement surtout) une base de données qui recensent tous les flippers du monde.
\o/
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 ?
Oui
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.
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.
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.
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).
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)
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”.
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)
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”.
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 ?
Aucune idée. Supprime les dossiers créés. Fait un “pip install peewee –user” et voit si ça apparait dedans.
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 ?
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.
Effectivement, j’ai python 2.7 et 3.5.
C’est bon j’ai compris. Sur python 3.5, il faut remplacer
__builtin__
parbuiltins
.Et pour Idle, l’import fonctionne bien mais le texte n’est pas affiché. Mais bon … ça fonctionne sur Pycharm!
Merci Sam.