2017-03-08 1 views
1

J'utilise setup.py pour créer un paquet foo et ensuite l'installer localement avec pip install . dans un environnement virtuel (python 2.7). Dans l'interpréteur python env virtuel, je peux importer foo, mais python semble penser que foo est plus un module qu'un paquet python (le type de paquet avec le fichier __init__.py) parce que lorsque j'essaie d'appeler foo sous-structure, foo.bar, cela me donne une erreur à propos du module qui n'a pas l'attribut bar.Python pense que mon package setup.py est un module pas un paquet python

Par exemple, je peux importer foo sans problème, mais si je tente et appeler quelque chose de foo, il échoue avec le message d'erreur:

>>> import foo 
>>> foo.bar 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
AttributeError: 'module' object has no attribute 'bar' 

est ici la structure du dossier:

foo/ 
    foo/ 
     __init__.py 
     bar.py 
setup.py 

Voici mon fichier setup.py:

from setuptools import setup 

setup(
    url='none', 
    author='loren', 
    name='foo', 
    version='1.0.0', 
    packages=['foo'], 
) 

Inte en reposant, je peux importer la barre avec from foo import bar et non seulement cela fonctionne mais il fixe alors mon erreur ci-dessus et d'autres appels à foo.bar renvoyant le module bar, mais ce n'est pas très utile pour moi.

Que dois-je faire pour obtenir

>>> import foo 
>>> foo.bar 

pour fonctionner correctement?

+0

Quel est le contenu du fichier '__init __. Py'? – jwodder

+0

Le fichier '__init __. Py' est vide – user2859458

Répondre

1

Il s'avère que je ne comprenais pas comment fonctionnent les importations de paquets Python __init.__.py. Je pensais que tous les sous-modules sous-jacents d'un package (comme bar) étaient importés lorsque j'ai importé le package de niveau supérieur foo, mais cela est faux. Python n'importait pas les sous-modules pour empêcher le chargement de choses que je n'utiliserais pas, en particulier dans les gros paquets.

Si je voulais faire quelque chose comme:

>>> import foo 
>>> foo.bar 

alors tout ce que je devais faire était import bar dans le fichier __init__.py du module foo.

J'ai également appris que tous les paquets sont des modules (bien que tous les modules ne soient pas des paquets), c'est pourquoi mon erreur se plaignait de la façon dont le module n'avait pas l'attribut.

+1

Vous pouvez utiliser une importation relative explicite' from. import bar' au lieu de simplement 'import bar' dans' __init __. py', pour la compatibilité Python 3. (Voir [PEP 328] (https://www.python.org/dev/peps/pep-0328/).) – user2357112