Je construis un script d'aide simple pour le travail qui copiera quelques fichiers de modèle dans notre base de code dans le répertoire actuel. Cependant, je n'ai pas le chemin absolu vers le répertoire où les modèles sont stockés. J'ai un chemin relatif à partir du script mais quand j'appelle le script, il le traite comme un chemin relatif au répertoire de travail actuel. Existe-t-il un moyen de spécifier que cette URL relative provient plutôt de l'emplacement du script?
python
relative-path
path
baudtack
la source
la source
Réponses:
Dans le fichier contenant le script, vous voulez faire quelque chose comme ceci:
Cela vous donnera le chemin absolu vers le fichier que vous recherchez. Notez que si vous utilisez setuptools, vous devriez probablement utiliser son API de ressources de package à la place.
MISE À JOUR : je réponds à un commentaire ici afin que je puisse coller un exemple de code. :-)
Je suppose que vous voulez dire le
__main__
script lorsque vous mentionnez l'exécution directe du fichier. Si c'est le cas, cela ne semble pas être le cas sur mon système (python 2.5.1 sous OS X 10.5.7):Cependant, je sais qu'il y a des bizarreries avec des
__file__
extensions sur C. Par exemple, je peux le faire sur mon Mac:Cependant, cela soulève une exception sur ma machine Windows.
la source
filename = os.path.join(dir, 'relative', 'path', 'to', 'file', 'you' , 'want')
os.path.dirname(__file__)
peut donner une chaîne vide, utilisez à laos.path.dirname(os.path.abspath(__file__))
placedont vous avez besoin
os.path.realpath
(l'exemple ci-dessous ajoute le répertoire parent à votre chemin)la source
os.path.dirname(__file__)
m'a donné une chaîne vide. Cela a parfaitement fonctionné.os.path.realpath('..')
vous donne le répertoire parent du répertoire de travail actuel . Ce n'est généralement pas ce que vous voulez.Comme mentionné dans la réponse acceptée
Je veux juste ajouter ça
Cela devrait être quelque chose comme
La réponse acceptée peut être trompeuse dans certains cas, veuillez vous référer à ce lien pour plus de détails
la source
os.path.join
est meilleure car elle les joint au séparateur spécifique au système d'exploitation.'/relative/path...'
n'est pas un chemin relatif. Est-ce intentionnel?os.path.join()
. Ce qui reste est la préférence d'utiliser des chaînes distinctes pour chaque élément de chemin plutôt que de coder en dur le séparateur de chemin.C'est 2018 maintenant, et Python a déjà évolué
__future__
il y a longtemps. Alors que diriez - vous en utilisant l'incroyable àpathlib
venir avec Python 3.4 pour accomplir la tâche au lieu de lutter avecos
,os.path
,glob
,shutil
, etc.Nous avons donc 3 chemins ici (éventuellement dupliqués):
mod_path
: qui est le chemin du script d'aide simplesrc_path
: qui contient quelques fichiers modèles en attente de copie.cwd
: répertoire courant , destination de ces fichiers modèles.et le problème est: nous n'avons pas le chemin complet de
src_path
, savons seulement que c'est le chemin relatif vers lemod_path
.Maintenant, résolvons cela avec l'incroyable
pathlib
:À l'avenir, c'est aussi simple que cela. :RÉ
De plus, nous pouvons sélectionner et vérifier et copier / déplacer ces fichiers modèles avec
pathlib
:la source
Considérez mon code:
la source
Voir sys.path 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 appeler l'interpréteur Python.
Utilisez ce chemin comme dossier racine à partir duquel vous appliquez votre chemin relatif
la source
sys.path[0]
n'est pas toujours défini sur le répertoire parent. Le code Python peut être invoqué avec-c
ou-m
ou via un interpréteur intégré, auquel point ilsys.path[0]
est défini sur quelque chose de complètement différent.À la place d'utiliser
comme dans la réponse acceptée, il serait plus robuste d'utiliser:
car l'utilisation de __file__ renverra le fichier à partir duquel le module a été chargé, s'il a été chargé à partir d'un fichier, donc si le fichier avec le script est appelé d'ailleurs, le répertoire retourné ne sera pas correct.
Ces réponses donnent plus de détails: https://stackoverflow.com/a/31867043/5542253 et https://stackoverflow.com/a/50502/5542253
la source
inspect.stack()
est une fonction coûteuse à appeler. Il récupère les informations pour tous les cadres de pile, que vous jetez ensuite et obtenez uniquement celui du haut. Il appelle essentiellementinspect.getfile()
l'objet module, qui revient simplementmodule.__file__
. Vous êtes bien mieux d'utiliser simplement__file__
.Bonjour tout d'abord, vous devez comprendre les fonctions os.path.abspath (chemin) et os.path.relpath (chemin)
En bref os.path.abspath (path) crée un chemin relatif vers un chemin absolu . Et si le chemin fourni est lui-même un chemin absolu, la fonction renvoie le même chemin.
de même, os.path.relpath (chemin) crée un chemin absolu vers un chemin relatif . Et si le chemin fourni est lui-même un chemin relatif, la fonction renvoie le même chemin.
L'exemple ci-dessous peut vous permettre de comprendre correctement le concept ci-dessus :
supposons que j'ai un fichier input_file_list.txt qui contient la liste des fichiers d'entrée à traiter par mon script python.
D: \ conc \ input1.dic
D: \ conc \ input2.dic
D: \ Copyioconc \ input_file_list.txt
Si vous voyez la structure du dossier ci-dessus, input_file_list.txt est présent dans le dossier Copyofconc et les fichiers à traiter par le script python sont présents dans le dossier conc
Mais le contenu du fichier input_file_list.txt est le suivant:
.. \ conc \ input1.dic
.. \ conc \ input2.dic
Et mon script python est présent dans D: drive.
Et le chemin relatif fourni dans le fichier input_file_list.txt est relatif au chemin du fichier input_file_list.txt .
Ainsi, lorsque le script python doit exécuter le répertoire de travail actuel (utilisez os.getcwd () pour obtenir le chemin)
Comme mon chemin relatif est relatif à input_file_list.txt , c'est-à-dire "D: \ Copyofconc" , je dois changer le répertoire de travail actuel en "D: \ Copyofconc" .
Je dois donc utiliser os.chdir ('D: \ Copyofconc') , donc le répertoire de travail actuel sera "D: \ Copyofconc" .
Maintenant, pour obtenir les fichiers input1.dic et input2.dic , je vais lire les lignes ".. \ conc \ input1.dic" puis utiliser la commande
input1_path = os.path.abspath ('.. \ conc \ input1.dic') (pour changer le chemin relatif en chemin absolu. Ici, le répertoire de travail actuel est "D: \ Copyofconc", le fichier ". \ conc \ input1. dic "sera accessible par rapport à" D: \ Copyofconc ")
donc input1_path doit être "D: \ conc \ input1.dic"
la source
Ce code renverra le chemin absolu vers le script principal.
Cela fonctionnera même dans un module.
la source
sys.modules['__main__'].__file__
.Une alternative qui fonctionne pour moi:
la source
Ce qui a fonctionné pour moi, c'est d'utiliser
sys.path.insert
. Ensuite, j'ai spécifié le répertoire dont j'avais besoin. Par exemple, j'avais juste besoin de remonter d'un répertoire.la source
Je ne sais pas si cela s'applique à certaines des anciennes versions, mais je crois que Python 3.3 a un support de chemin relatif natif.
Par exemple, le code suivant doit créer un fichier texte dans le même dossier que le script python:
(notez qu'il ne devrait pas y avoir de barre oblique ni barre oblique inversée au début s'il s'agit d'un chemin relatif)
la source