2010-09-27 18 views
0

J'ai un projet qui est structuré comme celui-ci (couper beaucoup à donner l'essentiel) ...façon Pythonic modifier python chemin par rapport au répertoire courant

State_Editor/ 
    bin/ 
    state_editor/ 
     __init__.py 
     main.py 
     features/ 
      __init__.py 
      # .py files 
     io/ 
      __init__.py 
      # .py files 
     # etc. 

Vous avez l'idée. Maintenant, disons par exemple que foobar.py en features l'a fait ... from state_editor.io.fileop import subInPath. Évidemment State_Editor doit être dans le chemin. J'ai lu à propos des fichiers de configuration sys.path.append et path, mais je ne suis pas sûr de savoir comment accomplir ce que j'ai besoin d'accomplir, ou quelle est la façon la plus pythonique de le faire.

Le plus gros problème est que je ne sais pas comment spécifier "un répertoire vers le haut". Évidemment c'est .., mais je ne suis pas sûr de savoir comment éviter que cela soit interprété comme un littéral de chaîne. Par exemple, si je fais sys.path.append('../'), il ajoutera littéralement ../ au chemin. Donc, ma question est, quelle est la façon la plus «pythonique» d'accomplir cela?

+0

Que fait main.py? (Sans plus d'informations je mettrais main.py dans la racine de State_Editor et cela fonctionnerait comme vous le montrez) – Mark

+0

Je pensais que state_editor était censé contenir les scripts (suite à un guide de packaging que j'ai lu dans le tutoriel Python) . – person

+0

Cela fonctionnera certainement, et maintenant que je regarde autour de moi, cela semble assez commun. Merci. – person

Répondre

1

Dans les versions récente assez Python, "importations" par rapport tel que recommandé par @fseto peut être le meilleur (peut-être avec un from __future__ import absolute_import en haut de votre module). Pour une solution compatible avec une large gamme de versions Python, par exemple,

import sys 
import os 
sys.path.append(os.path.abspath(os.pardir)) 
+1

-1 Modifier sys.path dans une bibliothèque/module est une mauvaise idée, car il pourrait avoir des conséquences imprévues sur d'autres modules. Voir [cette discussion] (http://stackoverflow.com/questions/1893598/pythonpath-vs-sys-path), pour un exemple. – snapshoe