问题标签 [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 投票
1 回答
2743 浏览

python - How to manage several python subprojects with setuptools?

I'm wondering about the correct/easiest/most pythonic way of dealing with subprojects that you want have using the same base package. We currently have a file structure like this:

We want to keep the namespace company_name common to all our projects (maybe this itself is unpythonic?) but when proj1 and proj2 are installed in develop mode, the first one installed gets broken. It looks like import company_name... gets confused on which company_name package to look in and it grabs the first/last/random one.

How would this normally be handled in a larger python project? Is it possible to resolve this with a setup.py in the trunk that builds some sort of mega-egg? I haven't found any relevant info on google or stack, so any information even just links are greatly appreciated!


edit: I just tried adding a setup.py in the root folder with

with appropriate pkg_resources.declare_namespace(__name__) in the __init_.py files, but ./setup.py bdist_egg just gives:

error in company_name setup command: Distribution contains no modules or packages for namespace package 'company_name'

0 投票
1 回答
7090 浏览

python - Python:具有多个 setup.py 文件的多个包

我很难构建我的 Python setup.py 文件来做我想做的事。我有一个这样的包装:

我有另一个这样的包设置:

所以事情被组织在我的 site-packages/ 目录中,例如:

这正是我用 pip 安装它们后想要的。

我的问题是卸载第二个包(使用 pip)也会清除第一个包——这不是我想要发生的。我希望它只是删除 myutils.b 并将 myutils.a 保留在原处。

我怀疑我将多个init .py 文件与 myutils/ 文件夹混淆了,但我不确定如何让这些文件正常工作。

--

还发现了这个有用的页面:

http://www.sourceweaver.com/musings/posts/python-namespace-packages

0 投票
1 回答
7861 浏览

python - 在 Python 中制作命名空间包的方法

Distributed 中的命名空间包中,我知道我可以利用命名空间包将一个大的 Python 包分成几个较小的包。真是太棒了。该文件还提到:

请注意,顺便说一句,您的项目的源代码树必须包含命名空间包的 __init__.py 文件(以及任何父包的 __init__.py),在正常的 Python 包布局中。这些__init__.py 文件必须包含以下行:

此代码确保命名空间包机制正在运行,并且当前包已注册为命名空间包。

我想知道将相同的目录层次结构与包的层次结构保持一致有什么好处吗?或者,这只是distribute/setuptools的命名空间包功能的技术要求?

前任,

我想提供一个子包foo.bar,这样我必须构建以下文件夹层次结构并准备一个 __init__.py 以使 setup.py 工作于命名空间包:

我不熟悉命名空间包,但在我看来 1) foo/bar 和 2)(几乎)单行 __init__.py 是例行任务。他们确实提供了一些“这是一个命名空间包”的提示,但我认为我们已经在setup.py中获得了这些信息?

编辑:

如以下块所示,我可以在我的工作目录中拥有一个没有嵌套目录和单行 __init__.py 的命名空间包吗?也就是说,我们可以让setup.py只输入一行就自动生成这些namespace_packages = ['foo']吗?

0 投票
1 回答
419 浏览

python - 使用 Python 命名空间包进行开发

我在使用 python 命名空间包时遇到问题,想知道什么是好的解决方案。

我的项目结构类似于以下

这就是我正在做的项目。它具有也在同一个命名空间中的依赖项。

我正在处理 django 应用程序中的“app_ext”命名空间包。但是,我遇到了接收no module named app_ext.

我认为这与依赖命名空间包的安装方式有关(我正在使用 PIP 安装)。依赖命名空间的包没有__init__.py像分发 / setuptools 文档中记录的那样与文件一起安装,但它们都在其安装包中真正包含以下声明。

现在到了真正的问题。当已经安装了一些相关的命名空间包时,是否有使用命名空间包的技巧?

0 投票
2 回答
681 浏览

python - Namespace packages with a core part?

This question follows up The way to make namespace packages in Python and How do I create a namespace package in Python?.

Note PEP 420, and the distribute docs, which state:

You must NOT include any other code and data in a namespace package’s __init__.py. Even though it may appear to work during development, or when projects are installed as .egg files, it will not work when the projects are installed using “system” packaging tools – in such cases the __init__.py files will not be installed, let alone executed.


This all seems to make it impossible to have a "main library" package with independently distributed extension sub-packages. What I want is to be able to:

  1. define a core library package, to be used like this:

    /li>
  2. allow library extensions, packaged and distributed separately, to be used like this:

    /li>

I would've expected to be able to do this with namespace packages, but it seems not to be the case, based on the questions and links above. Can this be done at all?

0 投票
3 回答
2622 浏览

python - 无法安装使用相同命名空间的两个包

更新:单独使用 setup.py 安装两个软件包时,它们安装得很好。提取 sdist 生成的 tarball 并安装它们时,会发生相同的错误。这意味着我猜问题出在 setuptools 内部的某个地方。

我开发了两个具有两个命名空间包的项目:testsuite 和 testsuite.prettyprint。这两个命名空间包__init__.py都包含:

这是 testsuite.prettyprint.outcomes 的 setup.py:

这是 testsuite.prettyprint.traceback 的 setup.py:

安装它们时,它拒绝安装一个:

我不知道出了什么问题。即使您更改安装顺序,它也会说找不到另一个。

0 投票
2 回答
1521 浏览

python - python命名空间包的当前状态

我想在一个主模块中有几个 python 子模块,但我想将它们作为单独的 python 包分发。所以包A应该提供'my_data.source_a',包B应该提供'my_data.source_b',......等等。

我发现我必须为此使用命名空间包,但试图弄清楚细节,我发现多个 PEP 涵盖了该问题。PEP 420 似乎是最新的,它建立在 PEP 402 和 PEP 382 之上。

对我来说,不清楚不同 PEP 的实施状态是什么。所以我的问题是: http: //pythonhosted.org/distribute/setuptools.html#namespace-packages仍然是要走的路还是我应该如何构建我的命名空间包?

0 投票
1 回答
2446 浏览

python - Python setuptools:__init__.py 不调用 declare_namespace()

我正在尝试安装 zope2.zodbbrowser 0.2 包(https://pypi.python.org/pypi/zope2.zodbbrowser/0.2)。安装脚本失败并出现以下错误:

手册中的相关部分似乎在这里:https ://pythonhosted.org/setuptools/setuptools.html#namespace-packages

但是,我不熟悉 setuptools 的内部结构,并且无法在手册的帮助下解决问题。如何解决此命名空间问题以成功安装软件包?

供您参考,~/zodbbrowser/src/zope2.zodbbrowser/zope2/__ init__.py 的源代码为:

0 投票
0 回答
227 浏览

python - 构建一个命名空间包以通过 $PYTHONPATH 使用

这是一个措辞有点尴尬的问题,但基本上:

  • 我只能通过添加到 $PYTHONPATH 来激活 python 包
  • 我希望能够以这种方式使用任意 python 包
  • 一些 python 包使用包命名空间

我有一个包装脚本来构建一个 python 包,它主要是setup.py --single-version-externally-managed. 我可以在这个构建过程中添加任何我想要的东西——但它必须是通用的,因为它用于构建大量的包。

通常,我可以将构建结果添加到 $PYTHONPATH,一切都很好。

但是对于命名空间包(例如ndg-httpsclient),它们看起来很像它们只能在指定site-packages目录中工作,因为它们使用.pth文件。

令人困惑的,源代码中有一个ndg/__init__.py,其中包含命名空间包样板代码:

所以看起来它应该可以直接在 上导入$PYTHONPATH,但随后安装嘲弄我:

大概它有一个很好的理由这样做,但是它对 .pth 文件的依赖意味着结果不能通过 使用$PYTHONPATH,只能通过将其复制到众所周知的位置来使用,由于技术原因我无法做到这一点。我也无法将任意 python 注入到应用程序初始化中(site.addsitedir()也是如此)。

那么,有没有什么方法我不知道可以导入一个命名空间模块而不把它放在一个众所周知的位置?或者,有没有办法说服 setuptools 不要跳过__init__.py-- 并且这真的有效吗?

0 投票
0 回答
243 浏览

python - 直接从 setuptools 中的命名空间包导入

如何将模块用作命名空间包和特定子项目中类的容器?也就是说,我怎样才能直接从命名空间包而不是它的子包中导入一些东西?

一个例子可以使问题更清楚。

三个分包calc

假设我想创建一个名为 的命名空间包calc,上面有三个项目(sscce : calcs.tar.gz)。在目录中找到的第一个calc-add具有以下结构:

的内容calc-add/calc/__init__.py只是

根据命名空间包的要求,add.py只有以下功能:

目录下还有另一个项目,calc-sub结构如下:

__init__.py文件与前一个相同,sub.py只有一个简单的功能:

最后,我有一个calc-main包含以下内容的目录:

同样,__init__.py只有提到的行,但main.py有以下代码:

我如何调用以及如何调用apply()函数

如果我使用如下设置调用 Python 解释器$PYTHONPATH

那么我可以apply()这样称呼:

但是,我想apply()直接从调用calc,如下所示:

如果我将以下行添加到calc-main/calc/__init__.py

但是,setuptools 文档非常清楚:

您不得在命名空间包的 __init__.py 中包含任何其他代码和数据。即使它在开发过程中似乎可以工作,或者当项目安装为 .egg 文件时,当使用“系统”打包工具安装项目时它不会工作——在这种情况下,不会安装 __init__.py 文件,更不用说执行了。

那么如何在不打破文件限制的情况下获得我想要的东西__init__.py呢?那可能吗?