问题标签 [namespace-package]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
1113 浏览

python - python命名空间与包:使包成为默认命名空间

我有一个具有总体命名空间的项目,其中包含包。这是文件夹结构:

很简单。如果我想导入它,我使用:

它很好用,因为我的 setup.py 看起来像这样:

pypackage但是,当它曾经只是一个独立的 python 文件时,我有导入它的遗留代码。像这样:

那么我该如何制作它,以便我可以使用名称空间和子包保持相同的结构,但仍然以旧方式导入它?我该如何转这个:

进入这个:

换句话说,当我导入外部项目时,如何给pypackage.core.pypackage模块起别名?pypackagepypackage

0 投票
1 回答
299 浏览

python - Python 命名空间包

我按照这个说明从一个大的创建多个小的(独立的)Python2 包 - https://packaging.python.org/guides/packaging-namespace-packages/#pkg-resources-style-namespace-packages

现在我有多个具有这种结构的子(包):https ://github.com/pypa/sample-namespace-packages/tree/master/pkg_resources

我可以独立安装和使用它们,它工作得非常完美。但由于我在同一个命名空间下有 12 个包,我希望能够通过运行一个命令(例如pip install)来安装它们。例如。一些未来的项目将需要它们,所以我更喜欢将它们作为(常规)单体(一个依赖项)提供服务,但有时我只需要其中一个(这就是我使用命名空间的原因)。所以我需要setup.py在我的命名空间的根目录中有一些文件,其中包含所有子包install_requires或什么?我不知道如何像在任何常规项目结构中一样在根名称空间下一次安装所有小包(当我们不拆分它们并且根本不使用名称空间时),但是有单独安装它们的选项?

0 投票
1 回答
1543 浏览

python - 如何解决 Python 3.6 中的这个导入错误?

我有一个非常简单的命名空间包(下面包含的内容,以及目录布局)。如果我尝试 import namespace_repro.module,我收到以下错误:AttributeError: module 'namespace_repro' has no attribute 'module'. 据我了解,我的包具有有效的布局,并且导入应该可以工作。有趣的是,该错误仅在 Python 3.6.8 中存在,并且在 Python 3.7 中导入成功。

如何重现问题?

我有一个名为 a 的目录import-error-reprosetup.py见下文),然后是一个嵌套目录 path src/namespace_repro/module,其中包含三个文件__init__.pyx.pyy.py. 他们的内容:

setup.py

src/namespace_repro/module/__init__.py

src/namespace_repro/module/x.py

最后src/namespace_repro/module/y.py

我创建了一个全新的 Python 3.6 conda 环境conda create -n namespace6 python=3.6 ipython,然后我激活它并将包安装为pip install -e ./import-error-repro(注意-e没关系,没有它问题是可重现的)。在那之后,我尝试 import namespace_repro.moduleipython(尽管在官方的 python 解释器中也发生了同样的情况)。结果是

奇怪的是导入系统找到namespace_repro.module了两次,第三次却失败了!

其他一些有趣的行为:

目录布局

0 投票
0 回答
233 浏览

python - 命名空间包的正确设置是什么,无论是安装的还是作为源包的?

我有一个 Python 3.6 虚拟环境,其中(除其他外)安装了两个共享一个公共顶层目录的库shared_name。它不包含__init__.py. 据我了解,这应该是一个隐式命名空间包(PEP 420

当我添加到PYTHONPATH在顶层也使用该名称的源模块时,我无法找到后一个目录。shared_name当两个目录都有时, Python 找不到它__init__.py,也没有它。添加pkgutils.extend()到一个或两个__init__.py文件也无济于事。

结构是这样的:

立即下shared_name没有__init__.py文件。在运行时,sys.path包括source_package,但shared_name.__path__只包含lib/python3.6/site-packages/shared_name,而不是source_package

我不知道如何调试它或它可能有什么问题。命名空间包是否允许混合安装包和源包?(对我来说,文档似乎对这个话题保持沉默。)使用PYTHONVERBOSE也没有帮助我。例如,我不明白为什么

发生在任何证据表明它被尝试之前 - 更不用说匹配了 - 根本没有。

0 投票
1 回答
339 浏览

python - 4.6 之前的 pytest 能够从与已安装的命名空间包同名的本地包中导入,但现在不能。那是一个错误吗?

我克隆了这个演示命名空间包如何工作的玩具存储库:

具体来说,我将使用它的 pkg_resources 目录,该目录具有以下结构

example_pkg包是一个 pkg_resources 样式的命名空间包(在此处解释)。

我设置了我的python环境:

我从玩具存储库安装 pkg_a:

我将 pkg_b 从玩具存储库放在我的 PYTHONPATH 上:

我为 pkg_b 编写了一个测试套件,由一行组成:

现在,如果我在 pytest 4.5 或更低版本中运行该测试套件,它会成功:

但是如果我在 pytest 4.6 或更高版本中运行它,它会出错:

导入错误是可以理解的:它可能是example_pkg在站点包中查找,因此没有找到位于 PYTHONPATHb下的包。example_pkg

然而 pytest 4.5 或更早版本设法找到example_pkg.b.

编辑:根据评论,相关的区别是 pytest 4.5 和更早的导入pkg_resources. 确实,如果我添加该行

在我的测试文件 test_b.py 的顶部,即使在 pytest 4.6 或更高版本中,测试也会成功。此外,如果我有多个尝试导入的测试文件example_pkg.b,那么导入pkg_resources其中的任何一个 pytest 碰巧首先运行都是必要且足够的。

这意味着导入的一些副作用pkg_resources使得example_pkg.b可导入。究竟是pkg_resources做什么来达到这种效果的,我可以直接做到这一点,而不是将其作为看似未使用的导入的副作用吗?我需要这种副作用是否意味着设置无效?

0 投票
2 回答
486 浏览

python-3.x - Python 的命名空间包在本地开发项目中不可见

我正在尝试通过利用 Pythons namespace packages将一个大的(几乎是整体的)Python 项目拆分为多个部分。因此,我将文件解析器提取*.rules命名空间包中。Python 将此称为分布

我遵循了该指南,据我所知它部分有效,但是......

简而言之:在主项目中,单独分布的命名空间包的命名空间是不可见的,因为包搜索首先找到本地包,并不会与来自 的系统包合并site-packages

项目结构

这是我的目录/包和模块结构的一部分。

主要项目:

规则解析器的分布

包说明(安装工具)

主项目是这样打包的:

嵌入的命名空间是这样打包的:

所有发行版都是:

  • setuptools使用 Travis-CI打包
  • 部署到 PyPI,然后
  • 使用 .安装在本地计算机上pip

PyPI 的命名空间结构

问题描述

在使用 PyCharm 等主项目进行开发时,本地找到的命名空间优先于来自site-packages. 此外,这些命名空间不会被合并。因为主项目具有相同的根名称空间pyIPCMI,所以在本地开发项目中继续搜索,但不搜索site-packages

知道如何开发主要项目吗?


请告知需要什么信息来解决这个问题。我试图写下我目前掌握的所有信息。但是这个问题可能需要改进才能得到解决方案。

0 投票
0 回答
245 浏览

python-3.x - 如何将参数传递给 __init__.py?

考虑到 python 3.7 中的命名空间包,当我初始化它时如何将参数传递给我的包?

我希望能够打电话my_package(arg)

谢谢,

0 投票
1 回答
3337 浏览

python-3.x - “找不到包初始化文件(或不是常规文件)” - 为命名空间包构建 sdist 时出错

我有一个名称空间包,其文件夹结构为:CompanyName\DepartmentName\SubDepartmentName\PkgName

Python 3.3 及以上版本支持命名空间包,因此我没有将__init__.py文件放在以下文件夹中:

在 setup.py 中,我放置了以下代码setuptools.find_namespace_packages(),而不是 setuptools.find_packages().

当我尝试构建 sdist 时,使用以下命令:

我收到以下错误:

我将任务设置作为 azure devops 管道的命令行任务的一部分,并将“标准错误失败”设置为 true。由于上述错误,管道失败。

0 投票
1 回答
469 浏览

python - Python >= 3.3 中命名空间包的相对位置和内容

我阅读了文档和相当多的 stackoverflow 帖子,但没有找到明确的答案来解决我的疑问。

我想我了解命名空间包的用途。

我只对 Python>=3.3 和隐式命名空间包感兴趣 - 没有__init__.py.

问题

  1. 命名空间包是否应该只包含其他包,或者模块(即.py文件)也“允许”?

  2. 命名空间包是否应该仅用作“容器”包,或者它们也可以包含在常规包中

  3. 如果命名空间包仅作为容器有意义,我想我可以声明,每当我有一个真正的包文件夹时,它所有包含 python 模块的子文件夹也应该__init__.py?

我怀疑命名空间包仅作为容器才有意义,因为在另一种情况下,我将无法使用不同路径中的其他东西扩展命名空间,因为父级是一个必须在单个点中定义的真实包文件系统。因此,我不会获得命名空间包的主要优势。

语境

我之所以问,是因为在运行和导入模块(从项目的根目录)时,在常规包中带有隐式命名空间包的情况非常好。但是,它需要对安装脚本进行一些调整,我想知道我是否首先做了一些有缺陷的事情。

注意:我尝试使用隐式命名空间包主要不是因为我想利用它们的功能,而是因为我讨厌空__init__.py文件。我一开始以为python 3.3终于摆脱了这个,不再需要包__init__.py了,但似乎没有那么简单......

0 投票
1 回答
66 浏览

python - 使用 Python 的隐式命名空间支持时,可以将对象拉入顶级命名空间级别吗?

我有一个项目,我想重组以使用 Python 的本机隐式命名空间。我有我想像这样交互的代码:

admin子包位于完全独立的存储库中。这些文件的组织方式如下:

同样的子包:

我必须将原始包中的所有内容放入顶级core子包中,以使共享命名空间工作:

有没有一种方法可以构建它,以便我可以core在顶层访问我的包中的所有内容,如下所示?

import在文件中添加了适当的东西__init__.py,但我不知道如何将对象拉入顶级命名空间(如果它甚至受支持的话)。