676 votes

Obtenir le nom du script actuel en Python

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)

1 votes

Python 2 est obsolète. Utilisez print(var) à la place.

1 votes

Elia Iliashenko, "a demandé le 11 nov. '10 à 9h32"

9voto

xtonousou Points 414

Note : Si vous utilisez Python 3+, vous devez utiliser la fonction print() à la place

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

1 votes

Sys.argv[0][:-3] le ferait

0 votes

@konpsych c'est plus élégant

0 votes

Il y a une grande différence entre __file__ et sys.argv[0], voir stackoverflow.com/questions/5851588/…

8voto

Krishn Singh Points 31

Nous pouvons essayer ceci pour obtenir le nom du script actuel sans extension.

import os

nom_script = os.path.splitext(os.path.basename(__file__))[0]

8voto

TheOnlyAnil Points 305

Vous pouvez le faire sans importer os ou d'autres bibliothèques.

Si vous voulez obtenir le chemin du script Python en cours, utilisez : __file__

Si vous voulez obtenir seulement le nom de fichier sans extension .py, utilisez ceci :

__file__.rsplit("/", 1)[1].split('.')[0]

4voto

bitranox Points 69

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 :

  • vérifie si __main__ est présent
  • vérifie si __main__.__file__ est présent
  • donne un résultat valide à __main__.__file__ (ce script existe-t-il ?)
  • sinon : vérifie sys.argv :
  • pytest, docrunner, etc. sont-ils présents dans sys.argv ? --> si oui, les ignorer
  • pouvons-nous obtenir un résultat valide ici ?
  • sinon : inspecter la pile d'appels et obtenir le résultat éventuellement
  • si même la pile d'appels ne fournit pas de résultat valide, alors lancer une exception.

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.

0 votes

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é.

0 votes

@Yoel: merci pour cela. En cas de problème avec cette bibliothèque, veuillez me le faire savoir, je le mettrai à jour rapidement

1voto

PeterXX Points 108

Comme l'OP a demandé le nom du fichier de script actuel, je préférerais

import os
os.path.split(sys.argv[0])[1]

Prograide.com

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.

Powered by:

X