Comment puis-je trouver le répertoire de script avec Python? [dupliquer]
cette question a déjà une réponse ici:
- comment déterminer correctement le répertoire de script actuel? 13 Réponses
considère le code Python suivant:
import os
print os.getcwd()
j'utilise os.getcwd()
à obtenir le fichier de script de l'annuaire lieu . Quand j'exécute le script à partir de la ligne de commande, il me donne le chemin correct alors que quand je l'exécute à partir d'un script exécuté par code dans une vue Django il imprime /
.
Comment puis-je obtenir le chemin vers le script à partir d'un script exécuté par une vue Django?
mise à jour:
En résumé, les réponses obtenues jusqu'à présent - os.getcwd()
et os.path.abspath()
- donnent toutes deux le répertoire de travail actuel peut être ou non le répertoire où réside le script. Dans ma configuration d'hôte web
donne seulement le nom du fichier sans le chemin. __file__
n'y a-t-il aucun moyen en Python pour (toujours) être capable de recevoir le chemin dans lequel réside le script?
12 réponses
vous devez appeler os.path.realpath
sur __file__
, de sorte que lorsque __file__
est un nom de fichier sans le chemin vous obtenez toujours le chemin dir:
import os
print(os.path.dirname(os.path.realpath(__file__)))
j'utilise:
import os
import sys
def get_script_path():
return os.path.dirname(os.path.realpath(sys.argv[0]))
comme le souligne aiham dans un commentaire, vous pouvez définir cette fonction dans un module et l'utiliser dans différents scripts.
Essayer sys.path[0]
.
pour citer les docs Python:
Comme initialisé au démarrage du programme, le premier élément de cette liste,
path[0]
, est le répertoire contenant le script qui a été utilisé pour invoquer l'interpréteur Python. Si le répertoire de script n'est pas disponible (par exemple si l'interpréteur est invoqué de manière interactive ou si le script est lu à partir d'une entrée standard),path[0]
est la chaîne vide, qui dirige Python vers rechercher des modules dans le répertoire courant en premier. Notez que le répertoire script est inséré avant les entrées insérées à la suite dePYTHONPATH
.
ce code:
import os
dn = os.path.dirname(os.path.realpath(__file__))
définit" dn " au 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 "en" script_dir/vcb.init" (d'une manière indépendante de plate-forme) et ouvre ce fichier à lire par le script en cours d'exécution.
notez que "the currently executing script" est quelque peu ambigu. Si votre programme entier se compose de 1 script, alors c'est le exécute actuellement script et le " sys.path[0] " la solution fonctionne très bien. Mais si votre application se compose de script A, qui importe un paquet " P "et appelle alors script" B", alors" P. B " est en cours d'exécution. Si vous avez besoin d'obtenir le répertoire contenant "P. B", vous voulez la solution " os.path.realpath(__file__)
".
__file__
"donne simplement le nom du script (haut de la pile) actuellement en cours d'exécution:" X. py". Ce n'est pas le cas.
donner aucune information de chemin. C'est le "os".chemin.realpath" appel que le réel travail.
import os,sys
# Store current working directory
pwd = os.path.dirname(__file__)
# Append current directory to the python path
sys.path.append(pwd)
import os
script_dir = os.path.dirname(os.path.realpath(__file__)) + os.sep
cela a fonctionné pour moi (et je l'ai trouvé via le cette question de débordement de Stack )
os.path.realpath(__file__)
voilà ce que j'ai fini par dire. Cela fonctionne pour moi, si je importer mon script dans l'interpréteur, et aussi si je exécuter un 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)
C'est un assez vieux thread mais j'ai eu ce problème lorsque vous tentez d'enregistrer des fichiers dans le répertoire courant le script lors de l'exécution d'un script python à partir d'une tâche cron. getcwd() et beaucoup d'autre chemin de votre répertoire d'accueil.
pour obtenir un chemin absolu vers le script que j'ai utilisé""
directory = os.path.abspath(os.path.dirname(__file__))
essayez ceci:
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)
import os
exec_filepath = os.path.realpath(__file__)
exec_dirpath = exec_filepath[0:len(exec_filepath)-len(os.path.basename(__file__))]