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

5

我有一个自定义的Python egg,但我无法在外部加载其子模块(或嵌套模块)。我已成功地加载了根级模块。

以下是混淆后的结构:

my_egg/
    my_egg/
        __init__.py(空文件)
        module_one.py
        my_subdir\
            __init__.py(空文件)
            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个回答

7
我很惊讶没有人回答这个问题。在搜索谷歌、参考不同来源以及尝试不同方法后,我终于使它工作了。
有一个事情让我卡住了……我试图在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需要重启集群。
新的根initmy_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']

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接