Je suis en train d'essayer d'obtenir le nom du script Python qui est actuellement en cours d'exécution.
J'ai un script appelé foo.py
et j'aimerais faire quelque chose comme ceci pour obtenir le nom du script :
print(Nom_du_script)
Je suis en train d'essayer d'obtenir le nom du script Python qui est actuellement en cours d'exécution.
J'ai un script appelé foo.py
et j'aimerais faire quelque chose comme ceci pour obtenir le nom du script :
print(Nom_du_script)
En supposant que le nom du fichier est foo.py
, le code ci-dessous
import sys
print sys.argv[0][:-3]
ou
import sys
print sys.argv[0][::-1][3:][::-1]
Pour les extensions avec plus de caractères, par exemple le fichier foo.pypy
import sys
print sys.argv[0].split('.')[0]
Si vous voulez extraire à partir d'un chemin absolu
import sys
print sys.argv[0].split('/')[-1].split('.')[0]
affichera foo
Il y a une grande différence entre __file__
et sys.argv[0]
, voir stackoverflow.com/questions/5851588/…
Toutes les réponses sont excellentes, mais ont quelques problèmes que vous pourriez ne pas voir au premier coup d'œil.
Définissons ce que nous voulons - nous voulons le nom du script qui a été exécuté, pas le nom du module actuel - donc __file__
ne fonctionnera que s'il est utilisé dans le script exécuté, pas dans un module importé. sys.argv
est également discutable - que se passerait-il si votre programme était appelé par pytest ? ou par le lanceur pydoc ? ou s'il était appelé par uwsgi ?
et - il existe une troisième méthode pour obtenir le nom du script, que je n'ai pas vue dans les réponses - Vous pouvez inspecter la pile d'appels.
Un autre problème est que vous (ou un autre programme) pouvez manipuler sys.argv
et __main__.__file__
- il peut être présent ou non. Il peut être valide ou non. Au moins, vous pouvez vérifier si le script (le résultat souhaité) existe !
La bibliothèque lib_programname le fait exactement :
__main__
est présent__main__.__file__
est présent__main__.__file__
(ce script existe-t-il ?)Ainsi, ma solution fonctionne jusqu'à présent avec setup.py test
, uwsgi
, pytest
, pycharm pytest
, pycharm docrunner (doctest)
, dreampie
, eclipse
Il existe également un bel article de blog sur ce problème de Dough Hellman, "Determining the Name of a Process from Python"
Au fait, cela va changer à nouveau en python 3.9 : l'attribut file du module main est devenu un chemin absolu, plutôt qu'un chemin relatif. Ces chemins restent maintenant valides après que le dossier courant ait été modifié par os.chdir()
Donc je préfère m'occuper d'un petit module, au lieu de parcourir tout mon code pour voir s'il doit être modifié quelque part ...
Disclaimer: I'm the author of the lib_programname library.
Avec votre permission, j'ai voté pour votre réponse et j'y ai fait référence ainsi qu'à la bibliothèque dans ma réponse, ce qui augmentera peut-être leur visibilité.
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.
1 votes
Python 2 est obsolète. Utilisez print(var) à la place.
1 votes
Elia Iliashenko, "a demandé le 11 nov. '10 à 9h32"