Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在包中隐藏实现模块和子模块_Python_Python 2.7_Module_Pip_Packages - Fatal编程技术网

Python 在包中隐藏实现模块和子模块

Python 在包中隐藏实现模块和子模块,python,python-2.7,module,pip,packages,Python,Python 2.7,Module,Pip,Packages,我想把代码打包成只公开主要函数。我的目录如下: ./ 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\u functions中,我确实从internal\u mod

我想把代码打包成只公开主要函数。我的目录如下:

./
  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\u functions
中,我确实从
internal\u modules.A
导入了一些操作,但不是从
internal\u modules.B
导入,并且
A.py
B.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安装它,但我不想让我的
内部_模块
在安装后从我的软件包中可见

我可以安装它,但当我这样做

from my_module import public_module
它在
public\u module.py
的第一行中抛出
ImportError:没有名为internal\u modules.A的模块

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


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

您可以通过在模块名称下面加下划线来隐藏模块的内部内容,以防导入:

_你的模块在这里

E:
您还可以在包的
\uuuuuuuuuuuuuuuuuuuu
中定义
\uuuuuuuuuuuuuuuuuuu
——只有
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu>中的模块名将通过导入*

导入,我不知道包的
\uuuuuuuuuu。你能给我举个例子吗?顺便说一下,在内部模块上加下划线不起作用。与以前相同的错误(
my\u module.\u internal\u modules
\uu all\uuu=['module1','module2']
仅在从程序包导入时导入模块1和2*
。如果您愿意,您仍然可以直接访问包的内部_默认情况下,如果您导入了
导入包
,则不应导入带下划线的模块,但同样,专用用户仍可访问这些模块。