2017-10-19 1 views
3

Je suis nouveau dans les paquets Python, et j'ai du mal à faire marcher quelque chose. J'ai 3 paquets: engine, ui et db. Je voudrais utiliser db à partir des deux autres paquets. Quelle est la bonne façon de le faire? Je ne voudrais pas installer le paquet db, puisque je développe actuellement les 3 paquets en même temps.Importer un paquet commun à partir de deux autres paquets (python3)

Merci!


Pour le moment, je suis en train de le faire avec les importations de paquets de frères et soeurs, mais il suce tellement que je ne suis pas sûr que ce soit la bonne façon de le faire. Cette question est étroitement liée à des tonnes de questions telles que Relative imports in Python 3 ou ValueError: attempted relative import beyond top-level package, mais aucun d'entre eux a une valide, réponse travailler pour moi :-(

Voici ce que j'ai jusqu'à présent:

src/ 
    __init__.py  # empty file (is it useful?) 
    db/ 
    __init__.py # empty file 
    constants.py 
    ui/ 
    __init__.py # empty file 
    index.py 
    engine/ 
    ...some stuff... 

ici est index.py:

from .. import db 
print(db.constants.stuff) 

Cependant, en cours d'exécution ou cd ui && python3 index.pypython3 -m index.py échouent avec SystemError: Parent module '' not loaded, cannot perform relative import

Quand je tweak ce projet, je reçois parfois encore d'autres erreurs, comme ValueError: Attempted relative import in non-package

D'après ce que je lis sur https://docs.python.org/3/tutorial/modules.html, cela devrait fonctionner, devrait-il pas?

Qu'est-ce que je fais mal? Que dois-je faire pour (faire une chose si simple) utiliser un paquet commun de deux autres paquets?

+0

Pouvez-vous partager toute la structure du projet en utilisant quelque chose comme 'tree'? Parce que l'information actuelle montre seulement un fichier réel par paquet. Peut-être que vous confondez les paquets et les modules? – Arunmozhi

+0

Ceci est la structure actuelle, actuelle ('engine' est actuellement vide mais nécessitera éventuellement des choses de' db'). Donc oui, j'ai actuellement un module par paquet. Mais les paquets vont bientôt augmenter – Daladim

Répondre

0

__init__.py est utile, même s'il est vide. Il indique à Python qu'un dossier est un paquetage python.

Je pense que ce dont vous avez besoin est de modifier le chemin du système. Par exemple, supposons que vous voulez importer constants.py dans index.py, index.py ressemblerait à ceci:

import sys 
sys.path.append("..") 
from db import constants 
+0

Cela fonctionne, merci beaucoup! Cependant, à quel point cette solution de contournement est-elle sale? Je pensais avoir lu que c'est terriblement sale donc je ne voulais pas essayer ça (mais diable, ça marche, c'est tout ce que je veux après avoir tripoté ces importations pendant des heures) – Daladim

+0

Aussi, je sais que les '__init __. Py' vides sont bien , mais je me demandais à quel point le niveau supérieur était utile. Cela fonctionne sans cela, mais peut-être que définir un package de haut niveau est une bonne pratique? – Daladim

+0

Tout ce qu'il fait est d'ajouter le dossier au-dessus de celui que le script est dans votre chemin, de sorte que vous pouvez importer des modules frères. Je ne suis pas sûr que ça soit sale ou pas, c'est un peu à interpréter. Cela dit, il pourrait être une bonne idée de changer la structure de votre projet pour éviter les importations de fratries. Pourriez-vous avoir un répertoire source qui contient toutes vos classes et fonctions, et avoir ensuite un index.py de niveau supérieur qui importe tout et exécute une fonction principale? –