2017-06-28 2 views
2

J'ai besoin d'aide sur la façon d'organiser la source dans un paquet python - J'ai déjà suivi plusieurs tutoriels sur le web (en particulier this one) sur la façon de le faire, mais ce n'est pas travailler comme expliqué et comment je l'ai imaginé. Je veux créer un package python nommé binaryio. Il devrait offrir deux classes nommées BinaryReader et BinaryWriter que je veux que les utilisateurs soient en mesure d'importer avec__init__.py ne trouve pas les modules dans le même répertoire

from binaryio import BinaryReader 
from binaryio import BinaryWriter 

Ainsi j'ai créé mon dépôt et la structure de répertoire package comme suit:

  • binaryio (racine du référentiel)
    • binaryio (racine de package)
      • __init__.py (art. ci-dessous)
      • binaryreader.py (contient la classe BinaryReader)
      • binarywriter.py (contient la classe BinaryWriter)
    • setup.py (contient l'appel setuptools.setup)
    • .gitignore, README.md, LICENCE , ...

Comme vous pouvez le voir, les classes sont dans des fichiers séparés que je suis habitué à ce (provenant d'un C# arrière-plan). Je ne suis pas sûr que ce soit une bonne idée parce que les modules sont les "unités" en Python - mais sinon, encombrer toutes les classes en un seul gros fichier ne me semblait pas logique.

__init__.py se présente comme suit pour importer ces classes, ce qui (comme je l'ai compris) le from binaryio import BinaryReader d'éventuelles importations pour les utilisateurs plus tard:

from binaryreader import BinaryReader 
from binarywriter import BinaryWriter 

Cependant, quand j'installer le paquet localement (qui semble fonctionner correctement) et essayer de import binaryio, je reçois l'erreur suivante:

>>> import binaryio 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "D:\Projects\Git\binaryio\binaryio\__init__.py", line 1, in <module> 
    from binaryreader import BinaryReader 
ModuleNotFoundError: No module named 'binaryreader' 

Apparemment, quelque chose ne va pas avec mon __init__.py fichier. Je ne comprends pas cela, comme un fichier binaryreader.py fichier aka existe dans le même dossier que vous pouvez voir ci-dessus. Curieusement, mon IDE (PyCharm, ayant défini la racine du paquet en tant que dossier source) ne se plaint pas des instructions qu'il contient et peut résoudre toutes les références.

Qu'est-ce que je fais mal ici? Selon le tutoriel lié ci-dessus, mettre un fichier dans xyz.py avec une classe nommée Abc et puis écrire from xyz import Abc en __init__.py devrait fonctionner, mais apparemment ce n'est pas pour moi.

+0

Installer le paquet localement = en utilisant des outils de conditionnement ou juste déballer? – bakatrouble

+0

@bakatrouble Dans la racine du dépôt, j'ai lancé 'pip install .', puis j'ai essayé de l'importer en mode interactif. –

Répondre

2

Votre code fonctionnerait pour Python 2.x, mais pas 3.x en raison de différentes syntaxes d'importations relatives: sans point, Python 2.x rechercherait des modules dans le module racine et paquet actuel, et Python 3. x va chercher seulement dans la racine du module.

Les instructions d'importation que vous souhaitez utiliser sont les suivants:

from binaryio.binaryreader import BinaryReader 
from binaryio.binarywriter import BinaryWriter 

Works dans 2.x et 3.x Python sans « à terme »

+0

Est-ce que cela signifie que la réponse de Xatyrian avec seulement le point principal est équivalente à ceci, car ** \ __ init \ __. Py ** est déjà dans le dossier ** binaryio **? Ou est-ce que cette syntaxe ne fonctionne pas du tout en Python 2? –

+1

Oui, c'est presque équivalent. Les différences sont: l'extrait de Xatyrian nécessiterait 'from __future__ import absolute_import' pour Python 2.x et ma réponse ne fonctionnerait pas si le paquet' binaryio' ne se trouvait pas dans la racine du module. – bakatrouble

+1

Merci, je m'en doutais à cause de votre dernière déclaration sur les «futurs». J'accepte votre réponse comme réponse car elle explique le raisonnement qui la sous-tend. –

2

Je pense que vous devez ajouter un point dans votre importation instructions:

from .binaryreader import BinaryReader 
from .binarywriter import BinaryWriter 
+0

Cela a fonctionné parfaitement. Mais maintenant je suis vraiment intéressé par le fait que ** I ** doive nommer explicitement le répertoire courant avec le point, et tous les autres exemples que j'ai trouvés sur le web ne le font pas. Et pourquoi est-ce réellement une différence avec la version sans point (regarder cela maintenant, puisque personne ne m'a dit qu'il y a une différence ...) –

+1

c'est une différence entre python 2 et python 3. –

+0

Oh mon dieu, je suis tombé dedans le "Tutorials sur le web n'a pas spécifié la version de Python" piège à nouveau :(Merci pour effacer cela! –