2009-01-21 5 views
11

Fondamentalement, je vous pose la même question que ce gars-là: How to do relative imports in Python?Python - Faire importations en termes absolus à partir d'un sous-dossier

Mais personne ne lui a donné une bonne réponse. Étant donné que vous êtes dans un sous-dossier et que vous voulez monter dans un répertoire puis dans un autre sous-dossier, faire ce qu'ils ont suggéré ne fonctionne pas (comme le PO l'a souligné dans ses commentaires à leurs réponses).

Je sais que vous pouvez le faire en utilisant sys.path, mais je préférerais une méthode plus propre.

Exemple:

App 
__init__.py 
Package_A 
--__init__.py 
--Module_A.py 
Package_B 
--__init__.py 
--Module_B.py 

Comment pourrais-je importer Module_A en Module_B?

+0

Par "Module_A" voulez-vous dire "Package_A"? Un paquet contient un "__init__.py et, éventuellement, des modules supplémentaires.Pouvez-vous réécrire votre" Module_A "et" Module_B "pour être" Package_A "et" Package_B "afin que votre question soit plus claire? –

Répondre

10
main.py 
setup.py 
app/ -> 
    __init__.py 
    package_a/ -> 
     __init__.py 
     module_a.py 
    package_b/ -> 
     __init__.py 
     module_b.py 
  1. Vous exécutez python main.py.
  2. main.py fait: import app.package_a.module_a
  3. module_a.py-t import app.package_b.module_b

Sinon 2 ou 3 pourrait utiliser: from app.package_a import module_a

qui fonctionnera aussi longtemps que vous avez app dans votre PYTHONPATH. main.py pourrait être n'importe où alors. Par conséquent, vous écrivez un setup.py pour copier (installer) l'ensemble du package d'application et des sous-packages dans les dossiers python du système cible, et main.py pour les dossiers de script du système cible.

+0

L'essentiel est d'ajouter les fichiers '__init __. Py' appropriés dans chaque répertoire et d'inclure' app' dans votre instruction import. Si vous faites cela, ajouter la ligne 'import app.package_a.module_a' à' module_b.py' devrait faire l'importation appropriée. Fondamentalement, l'étape 3 est ce que vous voulez, le reste est étranger sauf si vous prévoyez de distribuer le paquet. –

2

Si je suis readingcorrectly, en Python 2.5 ou supérieur:

from ..Module_B import Module_B 

Je croyais bien versé en Python, mais je ne savais pas qui était possible dans la version 2.5.

+0

C'est correct. C'est un peu moche, et les importations absolues sont généralement la meilleure chose sauf dans des circonstances spéciales – bobince

+2

Cela ne fonctionne pas Je reçois "tentative d'importation relative dans un non-paquet" – ryeguy

+0

L'instruction est supposée être dans Module_A.py (et, post-edit, devrait être de ..Package_B.Les importations relatives sont basées sur le chemin d'accès au module du module dans lequel vous vous trouvez, et non sur les répertoires. vous ne pouvez pas les utiliser à partir d'un script de niveau supérieur ou d'un module simple. – bobince

0

Si vous importez alors Module_B pour App, vous le feriez

Module_B.py: importation ModuleA

App.py (qui importe également ModuleA qui est maintenant par défaut dans votre PYTHONPATH)

import Module_B.Module_B 

une autre solution, consiste à mettre à jour __init__.py (l'une dans le dossier Module_A/App) à:

import os 
import sys 
sys.path.extend('%s../' % os.getcwd()) 
import ModuleA 

Une autre alternative consiste à ajouter votre dossier à l'environnement PYTHONPATH var.

+0

Modifier 'sys.path' à l'exécution est presque toujours faux. C'est fragile et indique un paquet mal structuré. – habnabit

+0

Je suis définitivement d'accord. –

Questions connexes