319 votes

Comment déterminer correctement l’actuel répertoire de script en Python ?

Je voudrais voir quelle est la meilleure façon de déterminer actuel répertoire du script en python?

J'ai découvert que deux des nombreuses façons d'appeler le code python, il est difficile de trouver une bonne solution.

Voici quelques problèmes:

  • __file__ n'est pas défini si le script est exécuté avec exec, execfile
  • __module__ est définie uniquement dans les modules

Cas d'utilisation:

  • ./myfile.py
  • python myfile.py
  • ./somedir/myfile.py
  • python somedir/myfile.py
  • execfile('myfile.py') (à partir d'un autre script, qui peut être situé dans un autre répertoire et qui peut avoir un autre répertoire en cours.

Je sais qu'il n'y a pas de solution parfaite, car dans certains cas, mais je suis à la recherche de la meilleure approche qui a résolu la plupart des cas.

La plus utilisée est l'approche os.path.dirname(os.path.abspath(__file__)) mais c'est vraiment ne fonctionne pas si vous exécutez le script à partir d'une autre avec l' exec().

Avertissement

Toute solution qui utilise le répertoire courant échoue, cela peut être différent en fonction de la façon dont le script est appelé ou il peut être modifié dans le script en cours.

273voto

bobince Points 270740
os.path.dirname(os.path.abspath(__file__))

est en effet le meilleur que vous allez obtenir.

Il est inhabituel d'être l'exécution d'un script avec exec/execfile; normalement, vous devriez être en utilisant le module d'infrastructure pour charger les scripts. Si vous devez utiliser ces méthodes, je vous suggère de réglage __file__ dans la globals vous passer au script de sorte qu'il peut lire le nom du fichier.

Il n'y a pas d'autre moyen pour obtenir le nom de fichier dans execed code: comme vous le notez, la MDC peut être dans un endroit complètement différent.

145voto

Sven Marnach Points 133943

Si vous voulez vraiment couvrir le cas où un script est appelé par , vous pouvez utiliser le module de déduire le nom de fichier (y compris le chemin d’accès). Autant que je sache, cela fonctionne pour tous les cas que vous avez énuméré :

49voto

J.F. Sebastian Points 102961
#!/usr/bin/env python
import inspect
import os
import sys

def get_script_dir(follow_symlinks=True):
    if getattr(sys, 'frozen', False): # py2exe, PyInstaller, cx_Freeze
        path = os.path.abspath(sys.executable)
    else:
        path = inspect.getabsfile(get_script_dir)
    if follow_symlinks:
        path = os.path.realpath(path)
    return os.path.dirname(path)

print(get_script_dir())

Il fonctionne sur Disponible, Jython, Pypy. Il fonctionne si le script est exécuté à l'aide d' execfile() (sys.argv[0] et __file__ -fondé des solutions serait de ne ici). Il fonctionne si le script est à l'intérieur d' un fichier exécutable fichier zip (/un oeuf). Il fonctionne si le script est "importé" (PYTHONPATH=/path/to/library.zip python -mscript_to_run) à partir d'un fichier zip; elle renvoie le chemin de l'archive dans ce cas. Il fonctionne si le script est compilé dans un fichier exécutable autonome (sys.frozen). Il travaille pour les liens symboliques (realpath élimine les liens symboliques). Il fonctionne en mode interactif interprète; elle renvoie le répertoire de travail courant dans ce cas.

5voto

wim Points 35274

Il suffit d’utiliser et examiner très attentivement s’il existe un réel besoin pour le cas où est utilisé. Ça pourrait être un signe de trouble conception si vous n’êtes pas en mesure d’utiliser votre script en tant que module.

Gardez à l’esprit Zen de Python #8, et si vous croyez qu’il y a un bon argument pour un cas d’utilisation où il doit travailler pour `` , alors s’il vous plaît laissez-nous savoir quelques précisions sur le fond du problème.

4voto

Will McCutchen Points 8193

Serait

fais ce que tu veux ? Je ne sais pas quoi exactement vous voulez dire par le « répertoire de script actuel ». Quels seraient les résultats attendus pour les cas d’utilisation que vous a donné ?

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