2013-01-08 4 views
13

J'ai le paquet p qui a les modules a et b. a repose sur b:Force l'importation du module à partir du répertoire courant

b.py contenu:

import a 

Cependant, je veux assurer que mon module b importe des a du même répertoire paquet p et pas seulement un module a de PYTHONPATH.

Je suis en train de changer b.py comme ce qui suit:

from . import a 

Cela fonctionne aussi longtemps que j'importer b quand je suis à l'extérieur du répertoire p du package. Étant donné les fichiers suivants:

/tmp 
    /p 
     a.py 
     b.py 
     __init__.py 

Les travaux suivants:

$ cd /tmp 
$ echo 'import p.b' | python 

Ce qui suit ne fonctionne pas:

$ cd /tmp/p 
$ echo 'import b' | python 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "b.py", line 1, in <module> 
    from . import a 
ValueError: Attempted relative import in non-package 

Pourquoi?

P.S. J'utilise Python 2.7.3

Répondre

5

Après avoir relu Python import documentation, la bonne réponse à mon problème d'origine est:

Pour veiller à ce que b les importations a de son propre paquet sa juste assez pour écrire ce qui suit dans le b:

import a 

Voici la citation des docs:

The submodules often need to refer to each other. For example, the surround module might use the echo module. In fact, such references are so common that the import statement first looks in the containing package before looking in the standard module search path.

Note: Comme le suggère J.F. Sebastian dans le commentaire ci-dessous, l'utilisation d'importations implicites n'est pas conseillée, et elles sont, en fait, passées en Python 3.

+9

n'utilisez pas les importations relatives implicites (elles sont passées en Python 3). Toujours utiliser l'import absolu ('de p import a' (ajouter' from __future__ import absolute_import' avant s'il y a un fichier 'p/p.py')) ou une importation relative explicite (' from. Import a' (si ce n'est pas le cas) un module '__main__')). N'exécutez pas de scripts à l'intérieur d'un répertoire de paquetages Python; il ajoute ce répertoire à sys.path, ce qui peut conduire à ce que le même module soit disponible sous des noms différents, ce qui conduit à des bogues liés à l'état du module (si vous utilisez des imports relatifs implicites, il masque également les autres modules). – jfs

+0

Bonnes notes. Merci! –

+1

Si vous re-postez est comme une réponse, je vais l'accepter. –

0

Parce qu'il existe un fichier __init__.py dans /p. Ce fichier indique à Python: "Tous les modules de ce dossier sont dans le paquet p". Si le fichier __init__.py existe, vous pouvez importer b sous la forme p.b, peu importe où vous êtes.

Ainsi, l'importation correcte b.py serait: import p.a

+0

Quelle version de Python? Ce comportement a changé dans le passé. –

+0

Modification de 'b.py' comme vous l'avez suggéré. Maintenant, l'exécution de 'import b' donne' ImportError: aucun module nommé p.a'. Python 2.7.3 –

+0

Vous ne devriez jamais utiliser 'import b' dans un tel scénario. Utilisez toujours 'import p.b' ou mettez les symboles nécessaires à disposition de' __init __. Py' et 'import p' pour cacher les détails internes. –

0

les importations relatives ne fonctionnent dans des packages.

Si vous importez b d'où vous êtes, il n'y a pas de notion de package, et donc il n'y a aucun moyen pour une importation relative. Si vous importez p.b, il s'agit du module b dans le package c.

Ce n'est pas la structure du répertoire qui compte, mais la structure des paquets.

Questions connexes