Comment puis-je obtenir le chemin d'accès et nom du fichier qui est en cours d'exécution?
J'ai des scripts de l'appel à d'autres fichiers de script mais j'ai besoin d'obtenir le chemin d'accès du fichier qui est actuellement en cours d'exécution dans le processus.
Par exemple, disons que j'ai trois fichiers. À l'aide de execfile:
script_1.py
appelsscript_2.py
.- À son tour,
script_2.py
appelsscript_3.py
.
Comment puis-je obtenir le nom de fichier et le chemin d'accès de script_3.py
, de code dans script_3.py
, sans avoir à passer que l'information en tant qu'arguments de script_2.py
?
(Exécution os.getcwd()
renvoie l'original script de démarrage du chemin d'accès le fichier.)
- Connexes: Python
__file__
attribut absolu ou relatif? - os.chemin d'accès.la fonction realpath(fichier)
- connexes: Comment déterminer correctement répertoire du script courant?
Vous devez vous connecter pour publier un commentaire.
p1.py:
p2.py:
inspect.getfile(inspect.currentframe())
, il me donne le chemin complet du fichier en cours de traitement. Donc je ne suis pas sûr de ce que tu veux dire, ou sous quelles conditions ce ne serait pas donner le nom et le chemin d'accès".inspect.getabsfile()
et il a travaillé pour tous les cas que j'ai essayé.os.path.realpath(__file__)
__file__
ne fonctionne pas avecexecfile()
qui est explicitement mentionné dans la question.inspect.getfile()
renvoie la__file__
attribut si passé un module objet.inspect.currentframe()
renvoie le module. Ergo, c'est un moyen coûteux de dire__file__
.comme d'autres l'ont dit. Vous pouvez également utiliser os.chemin d'accès.realpath pour éliminer les liens symboliques:
__file__
renvoie 'script_name.py et d'autres fois 'script_name.pyc'. Si la sortie n'est pas stable."__file__"
entre guillemets (comme une chaîne de caractères) donne la dir à partir de laquelle cmd est exécuté, mais__file__
(sans les guillemets donne le chemin d'accès au fichier source ... pourquoi est-ce queos.path.realpath
fonction suppose ladir
partie de la voie de l'être.os.path.dirname(os.path.realpath(__file__))
retourne répertoire avec le fichier.os.path.dirname(os.path.realpath("__file__"))
renvoie la mdc.os.path.dirname(os.path.realpath("here_be_dragons"))
retourne également la mdc.Mise à jour 2018-11-28:
Voici un résumé des expériences avec Python 2 et 3. Avec
main.py - fonctionne foo.py
foo.py - fonctionne lib/bar.py
lib/bar.py - imprime filepath expressions
Pour Python 2, il peut être plus clair pour passer les paquets pouvez utiliser
from lib import bar
- il suffit d'ajouter vide__init__.py
fichiers pour les deux dossiers.Pour Python 3,
execfile
n'existe pas - le plus proche alternative estexec(open(<filename>).read())
, bien que cela affecte la pile d'images. Il est plus simple d'utiliserimport foo
etimport lib.bar
- pas de__init__.py
les fichiers nécessaires.Voir aussi La différence entre l'importation et l'execfile
Réponse Originale À Cette Question:
Ici est une expérience basée sur les réponses dans ce fil - avec Python 2.7.10 sur Windows.
La pile, ceux sont les seuls qui semblent donner des résultats fiables. Les deux dernières ont la plus courte de la syntaxe, c'est à dire -
Voici pour ceux-ci étant ajoutés à sys comme des fonctions! Crédit @Usagi et @pablog
Basé sur les trois fichiers suivants, et en cours d'exécution main.py de son dossier avec
python main.py
(également essayé execfiles avec des chemins absolus et appeler à partir d'un dossier séparé).C:\filepaths\main.py:
execfile('foo.py')
C:\filepaths\foo.py:
execfile('lib/bar.py')
C:\filepaths\lib\bar.py:
Je pense que c'est plus propre:
et obtient les mêmes informations que:
Où [0] est l'image courante dans la pile (en haut de la pile) et [1] pour le nom de fichier, l'augmentation de revenir en arrière dans la pile, c'est à dire
serait le nom de fichier du script qui appelle l'image en cours. Aussi, à l'aide de [-1] vous rendre sur le bas de la pile, l'original script d'appel.
inspect.getfile()
renvoie la__file__
attribut si passé un module objet.inspect.currentframe()
renvoie le module. Ergo, c'est un moyen coûteux de dire__file__
.inspect.stack()
est assez cher fonction, plus que justeinspect.currentframe()
, et il fait aussi appelinspect.getfile()
sur un objet module.__file__
.Les suggestions marqué comme meilleure sont tous vrai si votre script se compose d'un seul fichier.
Si vous souhaitez trouver le nom de l'exécutable (c'est à dire la racine du fichier transmis à l'interpréteur python pour le programme actuel) à partir d'un fichier qui peut être importé en tant que module, vous avez besoin pour ce faire (imaginons que c'est dans un fichier nommé foo.py):
import inspect
print inspect.stack()[-1][1]
Parce que la dernière chose (
[-1]
) sur la pile est la première chose qui est entré en elle (les piles sont LIFO/FILO structures de données).Puis dans le fichier bar.py si vous
import foo
il va imprimer bar.py, plutôt que de foo.py, qui serait la valeur de l'ensemble de ces:__file__
inspect.getfile(inspect.currentframe())
inspect.stack()[0][1]
sys.modules['__main__'].__file__
, vraiment.cela nous donnera le nom du fichier uniquement. c'est à dire si abspath de fichier est c:\abcd\abc.py puis la 2ème ligne d'impression abc.py
Ce n'est pas tout à fait clair ce que tu veux dire par "le chemin du fichier qui est actuellement en cours d'exécution dans le processus".
sys.argv[0]
contient généralement l'emplacement du script qui a été invoquée par l'interpréteur Python.De vérifier la sys de la documentation pour plus de détails.
Comme @Tim et @Pat Notz l'avez souligné, l' __fichier__ attribut permet d'accéder à
J'ai un script qui doit fonctionner sous environnement windows.
Ce code ciselée est ce que j'ai fini avec:
il est tout à fait un hacky décision. Mais il ne nécessite pas de bibliothèques externes et c'est la chose la plus importante dans mon cas.
Pas besoin pour inspecter ou de toute autre bibliothèque.
Cela a fonctionné pour moi lorsque j'ai eu à l'importation d'un script (à partir d'un répertoire différent de l'exécution du script), qui utilise un fichier de configuration résidant dans le même dossier que le script importé.
La
__file__
attribut fonctionne pour le fichier contenant les principaux exécution de code ainsi que des modules importés.Voir https://web.archive.org/web/20090918095828/http://pyref.infogami.com/__file__
ce serait d'imprimer le chemin d'accès du script en cours d'exécution
Essayer cela,
Je pense que c'est juste
__file__
dirait que vous voulez également à la caisse de la inspecter module.Vous pouvez utiliser
inspect.stack()
Cela devrait fonctionner:
Pour obtenir le répertoire de l'exécution du script
J'ai utilisé l'approche par __fichier__
os.path.abspath(__file__)
mais il existe une petite astuce, il renvoie la .py fichier
lorsque le code est exécuté la première fois,
exécute ensuite donner le nom de *.pyc fichier
alors je suis resté avec:
inspect.getfile(inspect.currentframe())
ou
sys._getframe().f_code.co_filename
J'ai écrit une fonction qui tiennent compte de l'éclipse débogueur et unittest.
Retourner le dossier de la première script de lancement. Vous pouvez éventuellement spécifier le __fichier__ var, mais la chose principale est que vous n'avez pas à partager cette variable sur l'ensemble de vos l'appel de la hiérarchie.
Peut-être que vous pouvez gérer d'autres la pile cas particulier je n'ai pas vu, mais pour moi c'est ok.
Pour garder la migration de la cohérence entre les plates-formes (macOS/Windows/Linux), essayez:
path = r'%s' % os.getcwd().replace('\\','/')
Façon la plus simple est:
dans script_1.py:
dans script_2.py:
P. S.: j'ai essayé de
execfile
, mais depuis qu'il lit script_2.py comme une chaîne de caractères,sys.argv[0]
retourné<string>
.Voici ce que j'utilise donc je peux jeter mon code n'importe où sans problème.
__name__
est toujours défini, mais__file__
est défini uniquement lorsque le code est exécuté en tant que fichier (par exemple, pas en VEILLE/iPython).Sinon, cela peut être écrite comme suit:
J'ai toujours utilisé le système d'exploitation disposent de Répertoire de Travail Courant, ou de la MDC. Cela fait partie de la bibliothèque standard, et est très facile à mettre en œuvre.
Voici un exemple:
python script.py
commande dans le même dossier que vous êtes déjà, alors qu'en réalité c'est la même que l'exécution depwd
sur linux.La plupart de ces réponses ont été écrites en Python version 2.x ou une version antérieure. En Python 3.x la syntaxe de la fonction d'impression a changé d'exiger des parenthèses, c'est à dire d'impression().
Donc ce score élevé de réponse de user13993 en Python 2.x:
Devient en Python 3.x:
si vous voulez simplement le nom de fichier sans
./
ou.py
vous pouvez essayer cefile_name
imprime testscriptvous pouvez générer tout ce que vous voulez par l'évolution de l'indice à l'intérieur de []