2017-06-19 4 views
1

J'ai un oeuf Python personnalisé que j'ai écrit, et que je ne peux pas charger le sous-module (ou le module imbriqué) en externe. J'ai été capable de charger un module de niveau racine très bien.Comment importer des fonctions d'un sous-module dans un oeuf Python?

est ici la structure Obfuscated:

 
my_egg/ 
    my_egg/ 
     __init__.py (empty file) 
     module_one.py 
     my_subdir\ 
      __init__.py (empty file) 
      module_two.py 
    setup.py 

Importation module_one fonctionne:

from my_egg import module_one 

Mais je ne peux pas sembler obtenir module_two à importer. Voici ce que j'ai essayé:

from my_egg.my_subdir import module_two 
from my_egg import my_subdir.module_two 
from my_egg.my_subdir.module_two import * 

Aucun de ceux travaillés. Voici ce que mon setup.py ressemble:

from setuptools import setup 

setup(name='my_egg', 
    version='0.1', 
    packages=['my_egg'], 
    test_suite='nose.collector', 
    tests_require=['nose'], 
    zip_safe=False) 

Répondre

1

Je suis surpised personne ne répondit. J'ai été capable de le faire fonctionner après avoir parcouru Google, en tirant de différentes sources, et en essayant différentes choses. Une chose qui m'a soutenu ... J'essayais d'installer mon œuf sur un cluster Databricks. Et je ne me suis pas rendu compte qu'une fois que vous avez supprimé une bibliothèque (egg), le cluster doit être redémarré pour être supprimé. Donc, chaque fois que j'essayais des changements, rien ne prenait effet. Cela a définitivement retardé mes progrès.

Dans tous les cas, je suis passé à mon fichier setup.py pour utiliser find_packages et apporté des modifications aux fichiers vides __init__.py. Je ne suis pas vraiment sûr si les deux changements étaient nécessaires, ou si l'un aurait suffi.

Nouveau my_egg/setup.py:

exec(open('my_egg/version.py').read()) 

from setuptools import setup, find_packages 

setup(name='my_egg', 
     version=__version__, 
     packages=find_packages(exclude=('tests', 'docs')), 
     test_suite='nose.collector', 
     tests_require=['nose'], 
     zip_safe=False) 

J'ai ajouté un fichier my_egg/version.py pour me aider déboguer si j'utilisais la bonne version sur le cluster. Cet ajout m'a amené à découvrir que Databricks nécessite le redémarrage du cluster.

Nouveau fichier d'initialisation racine my_egg/my_egg/__init__.py:

from .version import __version__ 
from .module_one import module_one_func 
from .my_subdir.module_two import module_two_func 

__all__ = ['module_one_func'] 

Nouveau sous-répertoire d'initialisation my_egg/my_egg/my_subdir/__init__.py:

from module_two import module_two_func 

__all__ = ['module_two_func']