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

Edw*_*ler 2 python egg setuptools

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

这是混淆的结构:

我的蛋/
    我的蛋/
        __init__.py(空文件)
        module_one.py
        我的子目录\
            __init__.py(空文件)
            module_two.py
    设置文件

导入 module_one 有效:

from my_egg import module_one
Run Code Online (Sandbox Code Playgroud)

但我似乎无法导入 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 *
Run Code Online (Sandbox Code Playgroud)

这些都没有用。这是我的 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)
Run Code Online (Sandbox Code Playgroud)

Edw*_*ler 7

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

一件事阻碍了我……我试图在 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)
Run Code Online (Sandbox Code Playgroud)

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']
Run Code Online (Sandbox Code Playgroud)

新的子目录 init my_egg/my_egg/my_subdir/__init__.py

from module_two import module_two_func

__all__ = ['module_two_func']
Run Code Online (Sandbox Code Playgroud)