【发布时间】:2020-02-10 13:26:33
【问题描述】:
我正在尝试使用 Python namespace packages 将一个大型(几乎是单片的)Python 项目拆分为多个部分。因此,我将*.rules 文件的解析器提取到命名空间包中。 Python 将其称为发行版。
我遵循了该指南,据我所知它部分有效,但是...
简而言之: 在主项目中,单独分布的命名空间包的命名空间是不可见的,因为包搜索会先找到本地包,不会与site-packages的系统包合并。
项目结构
这是我的目录/包和模块结构的一部分。
主要项目:
pyIPCMI/ # Git repository root
pyIPCMI/
__init__.py
Common/
__init__.py
File1.py
Compiler/
__init__.py
Vendor1.py
Vendor2.py
setup.py
规则解析器的分发
pyIPCMI.Parser.Rules/ # Git repository root
pyIPCMI/
Parser/
Rules/
__init__.py
Parser.py
setup.py
包说明(安装工具)
主工程是这样打包的:
import setuptools
setuptools.setup(
name="pyIPCMI",
version="1.1.5",
author="Paebbels",
author_email="abc@xyz.de",
description="",
long_description="",
url="https://github.com/Paebbels/pyIPCMI",
packages=setuptools.find_packages(),
classifiers=["License :: OSI Approved :: Apache Software License"],
python_requires='>=3.5',
install_requires=[],
)
嵌入的命名空间是这样封装的:
import setuptools
namespace = ["pyIPCMI", "Parser", "Rules"]
setuptools.setup(
name=".".join(namespace),
version="1.1.4",
author="Paebbels",
author_email="abc@xyz.de",
description="",
long_description="",
url="https://github.com/Paebbels/pyIPCMI.Parser.Rules",
packages=setuptools.find_namespace_packages(
include=[".".join(namespace), ".".join(namespace) + ".*"]
),
namespace_packages=namespace[0:1],
classifiers=["License :: OSI Approved :: Apache Software License"],
python_requires='>=3.5',
install_requires=[],
)
所有发行版均已:
- 使用 Travis-CI 与
setuptools打包 - 部署到 PyPI,然后
- 使用
pip安装在本地机器上。
PyPI 的命名空间结构
pyIPCMI
pyIPCMI.Parser.Files
pyIPCMI.Parser.Rules
pyIPCMI.Toolchains
pyIPCMI.Toolchains.Vendor1
pyIPCMI.Toolchains.Vendor2
问题描述
在主项目中开发时,例如PyCharm,本地找到的命名空间比来自site-packages 的包更受欢迎。此外,这些命名空间不会被合并。
因为主项目具有相同的根命名空间pyIPCMI,所以在本地开发项目中继续搜索,但不在site-packages中搜索。
知道如何开发主项目吗?
请告知需要什么信息来解决这个问题。我试图写下我目前掌握的所有信息。但这个问题可能需要改进才能得到解决方案。
【问题讨论】:
-
您找到问题的答案了吗?
-
过去几个月我无法进一步调查。我想将我的问题简化为一个非常简单的包/子包设置,其中包含多个文件/模块中的一些导入和打印语句,以便进一步测试和/或报告。
标签: python-3.x pip python-packaging namespace-package