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

How to import functions from a submodule in a Python 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 *

None 的那些工作。这是我的 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)

我很惊讶没有人回答这个问题。在搜索 Google、从不同的来源提取并尝试不同的东西后,我能够让它工作。

有一件事让我停滞不前……我试图在 Databricks 集群上安装我的自定义 egg。而且我没有意识到一旦你删除了一个库(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 需要重启集群。

新根初始化 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']