in Perl, le Findbin code>
module est utilisé pour localiser le répertoire du script d'origine. Quelle est la façon canonique d'obtenir ce répertoire à Python? P>
Certaines des options que j'ai vues: p>
OS.Path.DirName (OS.Path.RealPath (sys.argv [0])) CODE> LI>
-
OS.Path.abspath (OS.Path.DirName (sys.argv [0])) CODE> LI>
-
OS.Path.Abspath (OS.Path.DirName (__ Fichier __)) CODE> LI>
ul>
3 Réponses :
Je n'utilise pas Python très souvent, donc je ne sais pas s'il y a un package comme Findbin A > Mais devrait fonctionner. p> p>
Je pense qu'u Findbin code> au lieu de 0 $ en Perl consiste à localiser le script, même il est accessible via un lien. SYS.ARGV [0] est presque identique à 0 $ et ne fonctionnera pas pour des liens.
Pardon, j'avais tort. Les deux ne fonctionneront pas pour des liens.
L'une des principales utilisations de Perl Findbin et Dir: auto _ dir i> _ est de charger des modules par rapport au script ou au module. Comme dans "Utilisez la liber _ DIR i> _" ou "Utiliser lib $ Findbin :: Realbin" aussi loin que possible, la réponse acceptée pour Python ne peut pas être utilisée de cette manière. // La réponse acceptée Python peut être utilisée pour spawn exécutables relativement.
@Krazyglew Principal i> B>, pas principe. En tout état de cause, vous ne connaissez pas le but de l'OP, mais clairement, cette réponse a rempli ses exigences.
@Sinanunur: principal non principe - blush i>, tu me as eu.
@Sinanunur: Je ne sais pas ce que l'OP cherchait, mais je sais ce que je recherche - une façon de charger des modules Python par rapport au répertoire contenant un script, sans avoir à gaver des chemins. Comme il ne semble pas y avoir de bonne réponse pour cela, je m'attends à poster une nouvelle question bientôt. J'attends aussi que quelqu'un dira une "question en double". Incorrectement, mais là tu vas. J'essaie donc d'enregistrer ici, ainsi que dans la nouvelle question, pourquoi la réponse acceptée n'est pas totalement correcte.
@Sinanunur: Sauf si vous voulez expliquer ici comment amener Python à faire l'équivalent de Perl "Utilisez Findbin; Utilisez lib" $ Findbin :: Realbin; ". Ou" Utiliser Dir :: Self; utiliser lib _ dir i> _; "// ou encore mieux, comment charger un module ou un package spécifique relativement sans rien ajouter au chemin de la bibliothèque du tout. (Parce que quelque chose au chemin vous expose toujours à Conflits possibles à l'avenir, comme fichiers sont ajoutés.)
Vous pouvez essayer ceci: qui vous donnera le chemin absolu du répertoire du fichier actuel. P> P>
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
N'utilisez pas Findbin: perlmonks.org/?node_id=41213
La plainte Perlmonks est ancienne et obsolète. Findbin a été créée car, avant l'avènement de / proc / pid / exe, les heuristiques étaient nécessaires pour trouver le chemin de l'exécutable actuel. Le plaignateur avait une heuristique, ce qui ne fonctionnait souvent pas toujours. Vers la fin, il a été signalé que la heuristique de Findbin avait été améliorée. Maintenant, il utilise / proc / pid / EXE lorsque disponible et sur ces systèmes, il est plus fiable que la plainte dans cette discussion de Perlmonks.
Permettez-moi d'ajouter à mes 3 ans + vieux commentaire sur Findbin toujours utile - Assez utile pour que Perl Findbin soit maintenant dans la distribution de Core Perl: Imho encore plus utile que Findbin est Dir de CPAN ''S, qui crée une pseudo-constante DIR B> qui se développe au répertoire Votre fichier source est en (absolu). Findbin ne fonctionne que pour l'exécutable; DIR B> fonctionne pour n'importe quel module.
DIR B> fonctionne pour tout fichier PERL, pas seulement des modules ou des packages. (Python de. Import ... semble fonctionner uniquement pour les colis.)
Ooops, désolé, c'est _ dir i> _. C'est à dire. Souligne soulignez le soulignement de soulignement D i r Soulignore.