Importation de modules à partir du dossier parent

J'utilise Python 2.5.

Voici l'arborescence de mes dossiers :

ptdraft/
  nib.py
  simulations/
    life/
      life.py

(J'ai aussi __init__.py dans chaque dossier, omis ici pour la lisibilité)

Comment puis-je importer le module nib à partir du module life ? J'espère qu'il est possible de le faire sans bricoler avec sys.path.

Note : Le module principal en cours d'exécution se trouve dans le dossier ptdraft.

Vous pourriez utiliser des importations relatives (python >= 2.5) :

from ... import nib

[(What's New in Python 2.5) PEP 328 : Absolute and Relative Imports][1]

EDIT : ajout d'un autre point &#39 ;.&#39 ; pour remonter deux paquets

[1] : http://docs.python.org/2/whatsnew/2.5.html#pep-328-absolute-and-relative-imports

Commentaires (10)
Solution

Il semble que le problème ne soit pas lié au fait que le module se trouve dans un répertoire parent ou autre.

Vous devez ajouter le répertoire qui contient ptdraft à PYTHONPATH

Vous avez dit que import nib a fonctionné avec vous, cela signifie probablement que vous avez ajouté ptdraft lui-même (pas son parent) à PYTHONPATH.

Commentaires (2)

Si l'ajout de votre dossier de modules au PYTHONPATH n'a pas fonctionné, vous pouvez modifier la liste sys.path de votre programme dans laquelle l'interpréteur Python recherche les modules à importer, comme le dit la [documentation python][1] :

Lorsqu'un module nommé spam est importé, l'interpréteur recherche d'abord un module intégré portant ce nom. S'il ne le trouve pas, il recherche alors un fichier nommé spam.py dans une liste de répertoires donnée par la variable sys.path. sys.path est initialisé à partir de ces emplacements :

  • le répertoire contenant le script d'entrée (ou le répertoire courant).
  • PYTHONPATH (une liste de noms de répertoires, avec la même syntaxe que la variable shell PATH).
  • la valeur par défaut dépendant de l'installation.

Après l'initialisation, les programmes Python peuvent modifier sys.path. Le répertoire contenant le script en cours d'exécution est placé au début du chemin de recherche, avant le chemin de la bibliothèque standard. Cela signifie que les scripts de ce répertoire seront chargés à la place des modules du même nom dans le répertoire de la bibliothèque. Il s'agit d'une erreur, sauf si le remplacement est prévu.

Sachant cela, vous pouvez faire ce qui suit dans votre programme :

import sys
# Add the ptdraft folder path to the sys.path list
sys.path.append('/path/to/ptdraft/')

# Now you can import your module
from ptdraft import nib
# Or just
import ptdraft

[1] : http://docs.python.org/tutorial/modules.html#the-module-search-path

Commentaires (3)