如何从Python egg中的子模块导入函数?

时间:2017-06-19 19:43:16

标签: python setuptools egg

我有一个我编写的自定义Python egg,我无法从外部加载子模块(或嵌套模块)。我已经能够正常加载根级模块了。

这是混淆的结构:

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

导入module_one有效:

from my_egg import module_one

但我似乎无法将module_two导入。这是我尝试过的:

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

这些都没有奏效。这是我的setup.py看起来的样子:

from setuptools import setup

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

1 个答案:

答案 0 :(得分:1)

我很惊讶没有人回答这个问题。在淘到谷歌之后,我从不同的资源中汲取经验,并尝试不同的事情,我能够让它发挥作用。

有一件事让我失望......我试图在Databricks集群上安装我的自定义鸡蛋。我没有意识到,一旦删除了一个库(egg),就必须重新启动集群才能将其删除。因此,每次我尝试更改,都没有生效。这无疑推迟了我的进步。

在任何情况下,我都更改为setup.py文件以使用find_packages并更改空__init__.py个文件。我不确定是否需要进行这两项更改,或者是否已经足够。

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)

如果我在群集上使用了正确的版本,我添加了my_egg/version.py文件来帮助我调试。这一添加实际上让我发现Databricks需要重新启动集群。

新的root init 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']

新的子目录初始my_egg/my_egg/my_subdir/__init__.py

from module_two import module_two_func

__all__ = ['module_two_func']