【问题标题】:Hide implementation modules and submodules in package隐藏包中的实现模块和子模块
【发布时间】:2017-11-10 22:46:16
【问题描述】:

我想打包我的代码以仅公开主要功能。我的目录是这样的:

./
  setup.py
  my_module/
    __init__.py
    public_functions.py
    internal_modules/
      __init__.py
      A.py
      B.py
      other_modules.py/
        __init__.py
        C.py

public_functions 中,我确实从internal_modules.A 导入了一些操作,但不是从internal_modules.B,并且A.pyB.py 都使用了来自C.py 的一些函数。

我的setup.py如下:

from setuptools import setup

setup(name='my_module',
      version='0.1',
      description='my_awesome_module',
      author='Me',
      author_email='example@mail.com',
      license='MIT',
      packages=['my_module'],
      zip_safe=False)

我想用 pip 安装它,但我不想让我的任何 internal_modules 在安装后从我的包中可见。

我可以正确安装它,但是当我这样做时

from my_module import public_module

它在public_module.py 的第一行抛出ImportError: no module named internal_modules.A

我知道如果我将my_module.internal_modules 作为另一个包添加到我的setup.py 声明中,我可以修复它,但这将使我的internal_modules 公开,A.pyB.py 从已安装的包中可见。

我发现了一个类似的问题here,但它对我不起作用

【问题讨论】:

    标签: python python-2.7 module pip packages


    【解决方案1】:

    您可以通过在模块名称下划线来隐藏模块的内部结构:

    _yourmodulenamegoeshere.

    E: 您还可以在包的 __init__ 中定义 __all__ - 只有来自 __all__ 的模块名称将通过 import * 导入。

    【讨论】:

    • 我不知道包的__init__ 中的__all__ 是如何工作的。能给我举个例子?顺便说一句,下划线_internal_modules 不起作用。和以前一样的错误 (my_module._internal_modules)
    • __all__ = ['module1', 'module2'] 只会在您执行from package import * 时导入模块 1 和 2。如果你愿意,你仍然可以直接访问包的内容。 _underscored 模块默认不应该被导入,如果你做了import package,但同样 - 一个专门的用户仍然可以访问它们。
    猜你喜欢
    • 1970-01-01
    • 2015-09-24
    • 1970-01-01
    • 1970-01-01
    • 2014-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多