10
votes

Importer des sous-répertoires soeurs à Python?

Donc, j'ai vu quelques questions similaires sur le débordement de la pile, mais rien ne semble aborder mon problème, ni le cas général. J'espère que cette question corrige cela et arrête mes maux de tête. J'ai un repo git de la forme: xxx

Comment puis-je importer mod2.py de mod1.py et vice versa, et comment cela change-t-il selon que mod1.py ou mod2.py sont des scripts (lorsque chacun est imparti à l'importation - non importé)?


0 commentaires

3 Réponses :


6
votes

La solution la plus simple consiste à placer le répertoire contenant repo dans votre pythonpath , puis utilisez simplement des importations de chemin absolu, par exemple. import repo.sub2.mod2 et ainsi de suite.

Toute autre solution consiste à impliquer certains hackys si vous souhaitez que cela couvre les cas où vous appelez les fichiers Python directement sous forme de scripts de répertoires arbitraires - le plus probable sys.path gangling efficacement accomplir la même chose que réglage pythonpath , mais sans avoir à le régler l'utilisateur.


2 commentaires

Je vais bien avec la modification de PythonPath, mais y a-t-il un moyen standard d'appliquer cela? Je ne veux pas que tous les nouveaux utilisateurs du représentant devaient entrer manuellement et mettre à jour leur pythonpath.


Si vous ne voulez pas que les gens aient à gérer pythonpath eux-mêmes, vous devrez peut-être envisager sys.path mangling. (Par exemple, utiliser __ fichier __ plus os.abspath Pour rechercher le lieu où le script est situé, puis obtenez le répertoire le nombre de niveaux au-dessus de celui-ci pour être repo < / Code> Sent 'S, puis sys.path.insert it.)



3
votes

Si vous utilisez Python 2.6+, vous avez deux choix:


2 commentaires

Je voulais vraiment que ces importations relatives fonctionnent. Cependant, sur mon python 2.7, ils ne fonctionnent pas.


À l'aide de Python 2.7, j'ai eu le succès à l'aide de déclarations telles que à partir de Sub2.Mod2 importer la chose .



0
votes

Un script ou un module peut importer des modules soit

  1. sur le chemin système, ou
  2. une partie du même package que le script / module importateur.

    Pour les modules, ces règles s'appliquent sans exception. Pour les scripts, les règles s'appliquent, mais la ride est celle-ci par défaut lorsque vous exécutez un script, il n'est pas considéré comme faisant partie d'un package.

    Cela signifie que par défaut, un script ne peut importer que des modules sur le chemin du système. Par défaut, le chemin inclut le répertoire actuel, donc si vous exécutez un script, il peut importer des modules dans le même répertoire ou les paquets de sous-répertoires. Mais c'est tout. Un script n'a aucune notion de "où il est" dans l'arborescence de répertoire, il ne peut donc pas effectuer d'importations nécessitant des informations spécifiques relatives relatives sur les répertoires englobantes. Cela signifie que vous ne pouvez pas importer de choses "à partir du répertoire parent" ou "à partir d'un répertoire de soeur". Les choses qui se trouvent dans ces répertoires ne peuvent être importées que si elles sont sur le chemin du système.

    Si vous souhaitez créer un script "savoir" dans un package, vous pouvez lui donner un document __ __ attribut. Voir Cette question précédente . Vous pouvez ensuite utiliser des importations relatives explicites (par exemple, de ... Sub2 Importer mod2 ) Normalement de l'intérieur de ce script.


0 commentaires