Python中的名称空间模块化

3

我有几个代码库需要进行命名空间处理。所有的代码库都遵循标准的Python文件夹结构,其中

repo1 - repo1 - __init__.py

最外层的repo1文件夹是根目录,内部的repo1文件夹是模块的根目录。所有这些存储库都将使用安装。

pip install -e .

目前,像以下这样的导入语句用于导入这些模块。
import repo1
import repo2
import repo3

有没有一种方法可以对这些模块进行命名空间,以便我可以拥有一个类似于 myModule.moduleName 的结构?
import mymodule.repo1
import mymodule.repo2
import mymodule.repo3

我需要实现命名空间,同时保持仓库分离。目前合并仓库不是一个选项。


1
https://packaging.python.org/guides/packaging-namespace-packages/ - Klaus D.
为什么你不能/不想合并仓库呢?是因为文件名冲突的原因吗?如果不是,那么答案就是在每个仓库中添加一个额外的目录,并像以前一样进行安装。例如,新的目录结构为repo1/mymodule/repo1/__init__.py。在新目录中不需要使用init。请参见 https://packaging.python.org/guides/packaging-namespace-packages/。 - Dunes
我们无法合并代码仓库,因为我们是一家金融机构,只有部分员工可以访问某些源代码。已经通过分离代码仓库的方式来解决这个问题。 - jiminssy
1个回答

2
实现细节取决于您对版本支持和分发的需求,但请查看setuptools中的namespace_packages,这将起到作用。
如上所述,打包站点有一个关于命名空间打包的有用页面
本地命名空间示例(Python >= 3.3)。用于隔离仓库的项目布局:
project_root1
├── finance_namespace  # no __init__ file here, this is important
│   └── repo1
│       ├── __init__.py  
│       └── module1.py
└── setup.py

===============================

# setup.py
import setuptools

setuptools.setup(
    name='repo1',
    version='1',
    description='',
    long_description='',
    author='Big bank',
    author_email='john@bank.com',
    license='MIT',
    packages=['finance_namespace.repo1'],
    zip_safe=False,
)

现在,通过执行 cd project_root1 && pip install -e . 命令,您应该能够进行操作。
>>> from finance_namespace.repo1 import module1
>>> module1.func()

我按照您的步骤以这种方式设置了每个仓库。然后我在每个仓库内执行了 "pip install -e ."。只有第一个仓库被正确安装。"import mymodule.repo1" 可以工作,但是 "import mymodule.repo2" 找不到。 - jiminssy
你对Python版本有什么要求? - Slam
Python版本3.5.2 - jiminssy
我已经添加了示例 - Slam

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