Python 3.x 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/

我正试图利用Python将一个大型(几乎是单一的)Python项目拆分成多个部分。因此,我将
*.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
并捕获 导入错误。我已经在这件事上浪费了太多时间,不想中断
正在工作的东西;)

你有没有找到你问题的答案