2010-03-29 5 views
6

En Perl, le module FindBin est utilisé pour localiser le répertoire du script original. Quelle est la manière canonique d'obtenir ce répertoire en Python?Quel est l'équivalent Python de FindBin de Perl?

Certaines des options que j'ai vu:

  • os.path.dirname(os.path.realpath(sys.argv[0]))
  • os.path.abspath(os.path.dirname(sys.argv[0]))
  • os.path.abspath(os.path.dirname(__file__))
+0

Ne pas utiliser FindBin: http://www.perlmonks.org/?node_id=41213 – runrig

+4

La plainte PerlMonks est vieux et obsolète. FindBin a été créé car, avant l'avènement de/proc/PID/exe, des heuristiques étaient nécessaires pour trouver le chemin de l'exécutable actuel. Le plaignant avait une heuristique, qui souvent mais ne fonctionnait pas toujours. Vers la fin, il a été rapporté que les heuristiques de FindBin avaient été améliorées. Maintenant, il utilise/proc/PID/exe lorsqu'il est disponible, et sur de tels systèmes, il est plus fiable que la plainte dans cette discussion perlmonks. –

+0

Permettez-moi d'ajouter à mes trois années + vieux commentaires sur FindBin encore être utile - utile assez que Perl FindBin est maintenant dans la distribution perl de base: à mon humble avis encore plus utile que FindBin est Dir :: Self CPAN, ce qui crée une __DIR__ pseudo-constante se développe dans le répertoire dans lequel se trouve votre fichier source (absolu). FindBin ne fonctionne que pour l'exécutable; __DIR__ fonctionne pour n'importe quel module. –

Répondre

6

Je ne me Python très souvent, donc je ne sais pas s'il y a paquet comme FindBin mais

import os 
import sys 
bindir = os.path.abspath(os.path.dirname(sys.argv[0])) 

devrait fonctionner.

+0

Je pense que l'utilisation de 'FindBin' au lieu de $ 0 en Perl est de localiser le script même s'il est accessible via un lien. sys.argv [0] est presque identique à $ 0, et ne fonctionnera pas pour les liens. –

+0

Désolé, j'avais tort. Les deux ne fonctionneront pas pour les liens. –

+0

L'une des principales utilisations de Perl FindBin et Dir :: Self _ _DIR_ _ est de charger des modules relatifs au script ou au module. Comme dans "use lib _ _DIR_ _" ou "use lib $ FindBin :: RealBin" Autant que je sache, la réponse acceptée pour Python ne peut pas être utilisée de cette manière. // La réponse Python acceptée peut être utilisée pour engendrer des exécutables relativement. –

12

Vous pouvez essayer ceci:

import os 
bindir = os.path.abspath(os.path.dirname(__file__)) 

Cela vous donnera le chemin absolu du répertoire du fichier en cours.

0

Pour mettre à jour sur les réponses précédentes, avec Python 3.4+, vous pouvez maintenant faire:

import pathlib 
bindir = pathlib.Path(__file__).resolve().parent 

qui vous donnera la même chose, sauf que vous obtiendrez un objet de chemin qui est bien plus agréable de travailler avec.

Questions connexes