Python 3.x Python';的命名空间包在本地开发项目中不可见
我正试图利用Python将一个大型(几乎是单一的)Python项目拆分成多个部分。因此,我将Python 3.x Python';的命名空间包在本地开发项目中不可见,python-3.x,pip,python-packaging,namespace-package,Python 3.x,Pip,Python Packaging,Namespace Package,我正试图利用Python将一个大型(几乎是单一的)Python项目拆分成多个部分。因此,我将*.rules文件的解析器提取到名称空间包中。Python将其称为发行版 我遵循了那个指南,据我所知,它部分有效,但 简而言之:在主项目中,单独分布的命名空间包的命名空间不可见,因为包搜索首先查找本地包,而不会与站点包中的系统包合并 项目结构 这是我的目录/包和模块结构的一部分 主要项目: pyIPCMI/ # Git repository root pyIPCMI/
*.rules
文件的解析器提取到名称空间包中。Python将其称为发行版
我遵循了那个指南,据我所知,它部分有效,但
简而言之:在主项目中,单独分布的命名空间包的命名空间不可见,因为包搜索首先查找本地包,而不会与站点包中的系统包合并
项目结构
这是我的目录/包和模块结构的一部分
主要项目:
pyIPCMI/ # Git repository root
pyIPCMI/
__init__.py
Common/
__init__.py
File1.py
Compiler/
__init__.py
Vendor1.py
Vendor2.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=[],
)
规则解析器的分发
pyIPCMI.Parser.Rules/ # Git repository root
pyIPCMI/
Parser/
Rules/
__init__.py
Parser.py
setup.py
软件包说明(设置工具)
主项目是这样打包的:
pyIPCMI/ # Git repository root
pyIPCMI/
__init__.py
Common/
__init__.py
File1.py
Compiler/
__init__.py
Vendor1.py
Vendor2.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=[],
)
嵌入式命名空间的打包方式如下:
pyIPCMI/ # Git repository root
pyIPCMI/
__init__.py
Common/
__init__.py
File1.py
Compiler/
__init__.py
Vendor1.py
Vendor2.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的名称空间结构
问题描述
当在主项目中使用例如PyCharm进行开发时,本地找到的名称空间优先于站点包
中的包。此外,这些名称空间不会合并。
由于主项目具有相同的根命名空间pyIPCMI
,因此搜索将在本地开发项目中继续,但不会在网站包中搜索
你知道如何开发主要项目吗
请告知解决此问题需要哪些信息。我试着写下我目前掌握的所有信息。但是这个问题可能需要改进才能找到解决方案。据我所知,名称空间包必须是空的,并且在所有已安装的项目中都是空的
显然,您的pyIPCMI
项目有一个顶级非名称空间包pyIPCMI
,即您有一个pyIPCMI/\uuuu init\uuuu.py
文件。因此,我认为在其他项目中不可能有pyIPCMI
名称空间包。如果希望pyIPCMI
在其他项目中成为名称空间包,我会尝试删除这个pyIPCMI/\uuuuu init\uuuuuuuupy.py
文件(并使其成为名称空间包)。据我所知,名称空间包必须是空的,并且在所有已安装的项目中都是空的
显然,您的pyIPCMI
项目有一个顶级非名称空间包pyIPCMI
,即您有一个pyIPCMI/\uuuu init\uuuu.py
文件。因此,我认为在其他项目中不可能有pyIPCMI
名称空间包。如果希望pyIPCMI
成为其他项目中的命名空间包,我会尝试删除这个pyIPCMI/\uuuuu init\uuuuuuuuupy.py
文件(并使其成为命名空间包)。作为第一个例子,
让我给你我的初始(非工作)布局
目录结构1(插件尚未提取)
应用程序已经有了基于此查找插件模块的代码
结构。写这篇文章时,我最初的理解是我可以提供
通过创建具有以下结构的Python包来添加插件:
plugin-package-dir
+-- pyproject.toml/setup.py
+-- myproject
+-- plugins
+-- plugin3
+-- __init__.py
+-- plugmodule.py
project-dir
+-- pyproject.toml/setup.py
+-- myproject
+-- __init__.py
+-- app.py
+-- myproject_plugins
+-- plugins
+-- plugin1
+-- __init__.py # <-- not strictly needed? (see note)
+-- plugmodule.py
+-- plugin2
+-- __init__.py # <-- not strictly needed? (see note)
+-- plugmodule.py
正如官方文档中提到的,名称空间包不包含
\uuuu init\uuuuu.py
文件位于此处
但这不起作用
解决方案
为了使这项工作,我需要提取“插件”包
完全从主项目子树中删除,使其成为纯名称空间
包装也一样。然后需要手动将此新包添加到setup.py
/pyproject.toml
,因为默认包发现无法识别它
我最终得到了以下结构:
plugin-package-dir
+-- pyproject.toml/setup.py
+-- myproject
+-- plugins
+-- plugin3
+-- __init__.py
+-- plugmodule.py
project-dir
+-- pyproject.toml/setup.py
+-- myproject
+-- __init__.py
+-- app.py
+-- myproject_plugins
+-- plugins
+-- plugin1
+-- __init__.py # <-- not strictly needed? (see note)
+-- plugmodule.py
+-- plugin2
+-- __init__.py # <-- not strictly needed? (see note)
+-- plugmodule.py
注意:由于
我加载插件的方式。为了遍历名称空间,我导入了它
在插件发现期间。相反,我可以捕获导入错误
并报告
没有找到任何插件
如果我可以删除\uuuu init\uuuu.py
并捕获
导入错误。我已经在这件事上浪费了太多时间,不想中断
正在工作的东西;) 我上周遇到了同样的问题,并找到了解决办法。作为第一个例子,
让我给你我的初始(非工作)布局
目录结构1(插件尚未提取)
应用程序已经有了基于此查找插件模块的代码
结构。写这篇文章时,我最初的理解是我可以提供
通过创建具有以下结构的Python包来添加插件:
plugin-package-dir
+-- pyproject.toml/setup.py
+-- myproject
+-- plugins
+-- plugin3
+-- __init__.py
+-- plugmodule.py
project-dir
+-- pyproject.toml/setup.py
+-- myproject
+-- __init__.py
+-- app.py
+-- myproject_plugins
+-- plugins
+-- plugin1
+-- __init__.py # <-- not strictly needed? (see note)
+-- plugmodule.py
+-- plugin2
+-- __init__.py # <-- not strictly needed? (see note)
+-- plugmodule.py
正如官方文档中提到的,名称空间包不包含
\uuuu init\uuuuu.py
文件位于此处
但这不起作用
解决方案
为了使这项工作,我需要提取“插件”包
完全从主项目子树中删除,使其成为纯名称空间
包装也一样。然后需要手动将此新包添加到setup.py
/pyproject.toml
,因为默认包发现无法识别它
我最终得到了以下结构:
plugin-package-dir
+-- pyproject.toml/setup.py
+-- myproject
+-- plugins
+-- plugin3
+-- __init__.py
+-- plugmodule.py
project-dir
+-- pyproject.toml/setup.py
+-- myproject
+-- __init__.py
+-- app.py
+-- myproject_plugins
+-- plugins
+-- plugin1
+-- __init__.py # <-- not strictly needed? (see note)
+-- plugmodule.py
+-- plugin2
+-- __init__.py # <-- not strictly needed? (see note)
+-- plugmodule.py
注意:由于
我加载插件的方式。为了遍历名称空间,我导入了它
在插件发现期间。相反,我可以捕获导入错误
并报告
没有找到任何插件
如果我可以删除\uuuu init\uuuu.py
并捕获
导入错误。我已经在这件事上浪费了太多时间,不想中断
正在工作的东西;) 你有没有找到你问题的答案