2011-06-08 4 views
3

Dans un programme, et évidemment influencé par la façon dont Java fait les choses, je veux lire un fichier statique (un fichier de configuration de journal, en fait) à partir d'un répertoire dans le PYTHONPATH de l'interpréteur. Je sais que je pouvais faire quelque chose comme:Ouvrir un fichier à partir de PYTHONPATH

import foo 
a = foo.__path__ 
conf = open(a[0] + "/logging.conf") 

mais je ne sais pas si cela est la manière « Pythonic » de faire les choses. Comment puis-je distribuer le fichier de configuration de journalisation d'une manière telle que mon application n'a pas besoin d'être configurée en externe pour le lire?

+1

Voir ce blog: http://dotnot.org/blog/archives/2004/03/06/ find-a-file-in-pythons-path/ – Nix

Répondre

1

En général, c'est très bien, mais je ne suis pas sûr de vouloir a[0] ci-dessus (qui va juste vous donner le premier caractère du chemin), et vous devez utiliser os.path.join au lieu de simplement annexant / être compatible multi-plateforme . Vous pouvez envisager de rendre le chemin canonique, c'est-à-dire os.path.abspath(os.path.dirname(foo.__path__)). Notez que cela ne fonctionnera pas si __path__ est dans un fichier zip ou si d'autres tricheries d'importation sont utilisées, mais je ne m'en soucierais pas (il n'est pas normal de le faire pour le programme principal en Python, contrairement à Java).

Si vous voulez prendre en charge les fichiers compressés, il y a pkg_resources, mais c'est quelque peu déconseillé à ce stade (il n'y a pas d'API correspondante que j'ai pu voir dans le nouveau module packaging).

+0

Merci pour la réponse. J'étais surtout à la recherche de confirmation que ma méthode est assez Python, donc je n'ai pas prêté beaucoup d'attention au code lui-même. –

0

Voici un extrait basé sur le lien Nix affiché upthread mais écrit dans un style plus fonctionnel:

def search_path(pathname_suffix): 
    cands = [os.path.join(d,pathname_suffix) for d in sys.path] 
    try: 
     return filter(os.path.exists, cands)[0] 
    except IndexError: 
     return None 
Questions connexes