web-dev-qa-db-fra.com

Obtenir le nom du script actuel avec Python

J'essaie d'obtenir le nom du script Python en cours d'exécution.

Par exemple, j'ai un script appelé foo.py et je voudrais faire quelque chose comme ça à l'intérieur:

print Scriptname

et obtenez: foo.py.

281
SubniC

Utilisez __file__. Si vous souhaitez omettre la partie de répertoire (qui peut être présente), vous pouvez utiliser os.path.basename(__file__).

442
Sven Marnach
import sys
print sys.argv[0]

Ceci imprimera foo.py pour python foo.py, dir/foo.py pour python dir/foo.py, etc. C'est le premier argument de python. (Notez qu'après py2exe, ce serait foo.exe.)

104
Chris Morgan

Notez que __file__ indiquera le fichier où réside ce code, qui peut être importé et différent du fichier principal en cours d’interprétation. Pour obtenir le fichier principal, vous pouvez utiliser le module spécial _MAIN_ :

import __main__ as main
print(main.__file__)

Notez que __main__.__file__ fonctionne dans Python 2.7 mais pas dans 3.2, utilisez donc la syntaxe import-as ci-dessus pour la rendre portable.

53
Ambroz Bizjak

Par souci d'exhaustivité, j'ai pensé qu'il serait utile de résumer les différents résultats possibles et de fournir des références pour le comportement exact de chacun:

  • __file__ est le fichier en cours d'exécution, comme indiqué dans la documentation officielle }:

    __file__ est le chemin du fichier à partir duquel le module a été chargé, s'il a été chargé à partir d'un fichier. L'attribut __file__ peut être manquant pour certains types de modules, tels que les modules C liés statiquement dans l'interpréteur; pour les modules d'extension chargés dynamiquement à partir d'une bibliothèque partagée, il s'agit du chemin du fichier de la bibliothèque partagée.

    À partir de Python3.4 à partir de, par numéro 18416 , __file__ est toujours un chemin absolu, à moins que le fichier en cours d'exécution ne soit un script exécuté directement (pas via l'interpréteur avec le -m option de ligne de commande) en utilisant un chemin relatif.

  • __main__.__file__ (nécessite d'importer __main__) il suffit d'accéder à l'attribut __file__ susmentionné du module principal }, par exemple. du script qui a été appelé à partir de la ligne de commande.

  • sys.argv[0] (nécessite d'importer sys) est le nom du script qui a été appelé à partir de la ligne de commande. Il peut s'agir d'un chemin absolu, comme indiqué dans la documentation officielle :

    argv[0] est le nom du script (le système d'exploitation dépend du nom de chemin complet ou non). Si la commande a été exécutée à l'aide de l'option -c en ligne de commande sur l'interpréteur, argv[0] est défini sur la chaîne '-c'. Si aucun nom de script n'a été transmis à l'interpréteur Python, argv[0] est la chaîne vide.

    Comme indiqué dans autre réponse à cette question , _ scripts Python convertis en programmes exécutables autonomes via des outils tels que py2exe ou PyInstaller risque de ne pas afficher le résultat souhaité avec cette approche (c.-à-d. sys.argv[0] contient le nom de l'exécutable plutôt que le nom du fichier principal Python de cet exécutable).


os.path.basename() peut être invoqué sur n'importe lequel des éléments ci-dessus afin d'extraire le nom de fichier actuel.

41
Yoel

Les réponses ci-dessus sont bonnes. Mais j'ai trouvé cette méthode plus efficace en utilisant les résultats ci-dessus.
Le résultat est un nom de fichier de script réel et non un chemin.

import sys    
import os    
file_name =  os.path.basename(sys.argv[0])
35
Manoj Sahu

Le premier argument de sys sera le nom de fichier actuel, donc cela fonctionnera

   import sys
   print sys.argv[0] # will print the file name
6
JohnStone

Essaye ça:

print __file__
6
demas

Pour les versions modernes de Python, Path(__file__).name devrait être plus idiomatique. De plus, Path(__file__).stem vous donne le nom du script sans l'extension .py.

5
Emil Melnikov

En supposant que le nom de fichier est foo.py, le fragment ci-dessous

import sys
print sys.argv[0][:-3]

ou

import sys
print sys.argv[0][::-1][3:][::-1]

affichera foo

5
xtonousou

Si vous effectuez une importation inhabituelle (par exemple, il s’agit d’un fichier d’options), essayez:

import inspect
print (inspect.getfile(inspect.currentframe()))

Notez que cela renverra le chemin absolu du fichier.

5
Gajendra D Ambi

Ma solution rapide et sale:

__file__.split('/')[-1:][0]
1
E.Big

os.path.abspath(__file__) vous donnera un chemin absolu (relpath() disponible également).

sys.argv[-1] vous donnera un chemin relatif.

0
CeDeROM