web-dev-qa-db-fra.com

Comment puis-je trouver le répertoire du script avec Python?

Considérez le code Python suivant:

import os
print os.getcwd()

J'utilise os.getcwd() pour obtenir l'emplacement du répertoire du fichier script . Lorsque j'exécute le script à partir de la ligne de commande, il me donne le chemin correct alors que lorsque je l'exécute à partir d'un script exécuté par code dans une vue Django, il affiche /.

Comment puis-je obtenir le chemin d'accès au script à partir d'un script exécuté par une vue Django?

MISE À JOUR:
Résumant les réponses jusqu'à présent - os.getcwd() et os.path.abspath() donnent toutes les deux le répertoire de travail actuel qui peut ou non être le répertoire où réside le script. Dans ma configuration d'hôte Web, __file__ Donne uniquement le nom de fichier sans le chemin.

N'y a-t-il aucun moyen dans Python pour (toujours) être en mesure de recevoir le chemin dans lequel réside le script?

477
Jonathan

Vous devez appeler os.path.realpath sur __file__ pour que, lorsque __file__ soit un nom de fichier sans le chemin, vous obtenez toujours le chemin du répertoire:

import os
print(os.path.dirname(os.path.realpath(__file__)))
674
Czarek Tomczak

Essayez sys.path[0].

Pour citer les docs Python:

Initialisé au démarrage du programme, le premier élément de cette liste, path[0], est le répertoire contenant le script utilisé pour appeler l'interpréteur Python. Si le répertoire de script n'est pas disponible (par exemple, si l'interpréteur est appelé de manière interactive ou si le script est lu à partir de l'entrée standard), path[0] est la chaîne vide, qui dirige Python vers les modules de recherche dans le répertoire. répertoire actuel en premier. Notez que le répertoire de script est inséré avant les entrées insérées à la suite de PYTHONPATH.

Source: https://docs.python.org/library/sys.html#sys.path

155
RED MONKEY

J'utilise:

import os
import sys

def get_script_path():
    return os.path.dirname(os.path.realpath(sys.argv[0]))

Comme l'a fait remarquer aiham dans un commentaire, vous pouvez définir cette fonction dans un module et l'utiliser dans différents scripts.

127
neuro

Ce code:

import os
dn = os.path.dirname(os.path.realpath(__file__))

définit "dn" sur le nom du répertoire contenant le script en cours d'exécution. Ce code:

fn = os.path.join(dn,"vcb.init")
fp = open(fn,"r")

définit "fn" sur "script_dir/vcb.init" (de manière indépendante de la plate-forme) et ouvre ce fichier en vue de sa lecture par le script en cours d'exécution.

Notez que "le script en cours d'exécution" est quelque peu ambigu. Si tout votre programme consiste en un script, il s'agit du script en cours d'exécution et la solution "sys.path [0]" fonctionne correctement. Mais si votre application est constituée du script A, qui importe un package "P" puis appelle le script "B", "P.B" est en cours d'exécution. Si vous devez obtenir le répertoire contenant "P.B", vous voulez la solution "os.path.realpath(__file__)".

"__file__" donne simplement le nom du script en cours d'exécution (en haut de la pile): "x.py". Cela ne donne aucune information sur le chemin. C'est l'appel "os.path.realpath" qui fait le vrai travail.

17
Al Cramer
import os,sys
# Store current working directory
pwd = os.path.dirname(__file__)
# Append current directory to the python path
sys.path.append(pwd)
15
jbcurtin
import os
script_dir = os.path.dirname(os.path.realpath(__file__)) + os.sep
7
beoliver

Cela a fonctionné pour moi (et je l'ai trouvé via le cette question de stackoverflow )

os.path.realpath(__file__)
7
Dan R

Voici ce que j'ai fini avec. Cela fonctionne pour moi si j'importe mon script dans l'interpréteur, et aussi si je l'exécute en tant que script:

import os
import sys

# Returns the directory the current script (or interpreter) is running in
def get_script_directory():
    path = os.path.realpath(sys.argv[0])
    if os.path.isdir(path):
        return path
    else:
        return os.path.dirname(path)
4
mpontillo

C'est un assez vieux fil, mais j'ai eu ce problème en essayant de sauvegarder des fichiers dans le répertoire courant dans lequel se trouve le script lors de l'exécution d'un script python à partir d'un travail cron. getcwd () et beaucoup d'autres chemins arrivent avec votre répertoire personnel.

pour obtenir un chemin absolu vers le script que j'ai utilisé

directory = os.path.abspath(os.path.dirname(__file__))

3
James

Utiliser os.path.abspath('')

3
Jonathan

Essaye ça:

def get_script_path(for_file = None):
    path = os.path.dirname(os.path.realpath(sys.argv[0] or 'something'))
    return path if not for_file else os.path.join(path, for_file)
0
Davious