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: 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é)? P> P>
3 Réponses :
La solution la plus simple consiste à placer le répertoire contenant 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 repo code> dans votre pythonpath code>, puis utilisez simplement des importations de chemin absolu, par exemple. import repo.sub2.mod2 code> et ainsi de suite. P>
sys.path code> gangling efficacement accomplir la même chose que réglage pythonpath code>, mais sans avoir à le régler l'utilisateur. P>
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 code> eux-mêmes, vous devrez peut-être envisager sys.path code> mangling. (Par exemple, utiliser __ fichier __ code> plus os.abspath code> 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 code> it.)
Si vous utilisez Python 2.6+, vous avez deux choix:
repo code> à votre pythonpath code> li>
ul> avec des importations relatives, une syntaxe de points spéciaux est utilisée: p>
dans le paquet SUB1: em> p> xxx pré> > dans le paquet SUB1A: em> p> xxx pré> Notez que les instructions d'importation ordinaire ( Import Module code>) ne fonctionnent pas avec les importations relatives . P> Une solution meilleure utiliserait des importations absolues avec votre chemin Python Set correctement (Exemple dans Bash Code>): P> export PYTHONPATH=/where/your/project/is:$PYTHONPATH
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 code>.
Un script ou un module peut importer des modules soit P>
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. P>
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. P>
Si vous souhaitez créer un script "savoir" dans un package, vous pouvez lui donner un document __ __ code> attribut. Voir Cette question précédente . Vous pouvez ensuite utiliser des importations relatives explicites (par exemple, de ... Sub2 Importer mod2 code>) Normalement de l'intérieur de ce script. P>