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
.
Utilisez __file__
. Si vous souhaitez omettre la partie de répertoire (qui peut être présente), vous pouvez utiliser os.path.basename(__file__)
.
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
.)
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.
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.
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])
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
Essaye ça:
print __file__
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
.
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
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.
Ma solution rapide et sale:
__file__.split('/')[-1:][0]
os.path.abspath(__file__)
vous donnera un chemin absolu (relpath()
disponible également).
sys.argv[-1]
vous donnera un chemin relatif.