标签: python-packaging

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

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

我想我明白命名空间包的用途。

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

问题

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

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

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

# this is fine
ns_package/
+-- real_package/
   +-- __init.py__

# how about this?
real_package/
+-- __init.py__  # I have it for docs AND want to force the dir to be a real package
+-- ns_package/  # I would just like to avoid an empty __init__.py
   +-- amodule.py
Run Code Online (Sandbox Code Playgroud)

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

语境

我问这个问题是因为在运行和导入模块(从项目的根目录)时,常规包内包含隐式名称空间包的情况工作得非常好。然而,它需要对安装的设置脚本进行一些调整,我想知道我一开始是否做了一些有缺陷的事情。

注意:我尝试使用隐式命名空间包主要不是因为我想利用它们的功能,而是因为我讨厌空 …

python python-3.x namespace-package python-packaging

5
推荐指数
1
解决办法
1603
查看次数

仅安装 pep 518 构建系统要求(构建 sdist)

PEP 518介绍了该pyproject.toml文件,以及描述构建所需工具的部分:

[build-system]
requires = ["setuptools", "wheel", "numpy>=1.13"]
Run Code Online (Sandbox Code Playgroud)

在这里,我告诉构建系统(隐式的 setuptools)我需要安装这三个要求才能运行构建。(是的,我实际上确实需要 numpy 作为构建过程的一部分。)

当我运行时pip wheel,它知道在此文件中查找此部分,安装需求,然后构建轮子。但是 pip 无法创建一个sdist发行版(而且它的维护者似乎不愿意添加一个发行版),所以我需要运行python setup.py sdist. 这就是问题所在:setup.py 不知道它需要 numpy,并且构建失败。

是否有一种标准方法来安装需求,然后构建 sdist?特别是pip已经朝着构建隔离的方向发展了,那么这可以通过隔离来完成吗?如果做不到这一点,我可以创建自己的环境来进行一些隔离;那么,在某些环境中安装需求的最佳方法是什么?

python pip setuptools python-packaging pyproject.toml

5
推荐指数
1
解决办法
1668
查看次数

Python setup.py - 如何包含共享库

python 打包(但不是 python)的新手,所以如果问题无处不在,请原谅。

尝试打包一个 python 模块(project-A ),它使用另一个目录( lib )中的一堆常见脚本。

对于如何将此lib目录包含在最终的包工件中遇到了困难。

setup.py、工作目录结构以及我如何规划最终的包安装结构如下所示。

还有几个问题——

  • lib的相对位置在我的工作目录和已安装的 package 之间发生变化。有没有一种方法可以在这两种情况下导入而不更改代码?
  • 这个结构更好还是我应该将与project_A相关的所有内容移到它自己的目录下,这样每个项目都会有自己的setup.py、MANIFEST、conf目录等。(lib的位置将保持不变,不确定每个项目是否包应该有自己的测试目录)
  • 如果有人在 git 存储库之外运行它,release=subprocess.check_output 将失败。在这种情况下有没有办法添加默认值?
  • 我遇到的一个例子是 lib 移动到了 /usr/lib/python3.4/site-packages/project_A/_lib. 喜欢这种方法。知道如何在 setup.py 中实现此目的

setup.py(当前创建两个包)

setup(
    name='project_A',
    version='0.15',
    # release is not supported in bdist rpm
    #release=subprocess.check_output(["git", "rev-list", "--count", "--first-parent", "HEAD"]).rstrip(),
    # if creating outside git
    release="0.0.1",
    author='foo',
    author_email='hello@world.com',
    url='http://www.hello.com',
    long_description="README.txt",
    #install_requires=['bottle','requests','supervisor'],  # currently not working
    #dependency_links = ['https://pypi.python.org/packages/source/b/bottle/bottle-0.12.8.tar.gz'],
    packages=['project_A'],
    include_package_data=True,
    package_data={'images' : ['hello.gif']},
    data_files=[
                #('/etc/init.d/', ['project_Actl']),  # some startup …
Run Code Online (Sandbox Code Playgroud)

python setuptools boilerplate python-3.x python-packaging

5
推荐指数
0
解决办法
1242
查看次数

将 gitlab 包注册表中的 python 包和其他外部索引直接包含到 setup.py 依赖项中

gitlab 包注册表可用于发布安装python 包。这样的安装可以完美地使用--extra-index-url或如文档--index-url中所述,并且我还使用此处描述的文件成功地测试了它。requirements.txt

尽管如此,出于许多目的,将它们直接添加到包setup.py中会更容易。

有没有办法将这些包从 gitlab 的注册表或其他外部索引直接添加到 的需求中setup.py

注意:我知道可以直接从 .git 存储库安装setup.py。但我想改用版本化的包注册表。

在此先感谢您的帮助!

git pip setuptools gitlab python-packaging

5
推荐指数
0
解决办法
3177
查看次数

包中的Python“requirements.txt”文件

情况:

我创建了一个 python 包,其中使用以下库:

  1. 绘图库
  2. 正则表达式
  3. 统计数据
  4. 操作系统
  5. 单元测试
  6. 覆盖范围

我的问题是,当我这样做时pip freeze,结果只返回版本值

  1. matplotlib==3.2.1
  2. 正则表达式==2020.11.13
  3. 统计==1.0.3.5
  4. 覆盖范围==5.3.1

我读过一些网站,他们说这是因为,例如,os 和 unittest 已经随 Python3.X 一起安装了。

问题:

  1. 我应该在“requirements.txt”中包含“os”、“unittest”吗?
  2. 如果是这样,我应该写哪个版本?

python requirements.txt python-packaging

5
推荐指数
1
解决办法
4万
查看次数

如何集成 pyenv、poetry 和 docker?

注意:我刚刚开始尝试学习docker,所以我是一个初学者

目前,我正在使用诗歌和 pyenv 来制作我的 python 项目。我使用 pyenv 作为我的 python 版本,并使用诗歌来创建和管理我的 python 项目。但是,我也想使用 docker。那么,我怎样才能将这三个集成到一个Python项目中呢?

package docker pyenv python-packaging python-poetry

5
推荐指数
1
解决办法
1万
查看次数

诗:如何发布针对多个Python版本的项目包?

我有一个项目想要发布为针对两个 Python 版本(3.6 和 3.8)的包。

我的理解是:

  • 如何使用pyenv.
  • 如何poetry创建与所选 Python 版本相对应的虚拟环境。
  • 如何设置pyproject.toml以指定 python 版本、管理依赖项以及使用此配置发布包。

我不明白的是:如何为多个 Python 版本发布同一个包?我不可能是唯一一个拥有此用例的人,对吗?

  • 需要两个pyproject.toml文件吗?(每个 python 版本和一组相应的依赖项都有一个......)
  • 是否有既定的方法可以用 Poetry 来做到这一点,或者是否需要其他工具/工作流程?

编辑

做了更多的挖掘,我发现这个https://python-poetry.org/docs/dependency-specation/#multiple-constraints-dependencies看起来可能是相关的。

这是上面链接中的示例。

[tool.poetry.dependencies]
foo = [
    {version = "<=1.9", python = "^2.7"},
    {version = "^2.0", python = "^3.4"}
]
Run Code Online (Sandbox Code Playgroud)

poetry add我还发现你可以使用这样指定Python版本...

poetry add cleo --python 3.6.10
Run Code Online (Sandbox Code Playgroud)

这会像这样添加依赖项pyproject.toml......

cleo = {version = "^0.8.1", python = "3.6.10"}
Run Code Online (Sandbox Code Playgroud)

要去尝试一下,看看这是否有效。

python-packaging python-poetry

5
推荐指数
1
解决办法
6620
查看次数

setup.py:如何查找用户指定的括号内的附加内容

我有一个通过 PyPI 分发的包,其中包含大量数据。PyPI 有 100MB 的限制,我想分发比这更多的数据。数据相当不变,因此在每次代码发布时不断将大量数据推送到 PyPI 似乎也很浪费。

相反,我更愿意分发最少的数据,并将大数据选项作为可选子包处理,例如pip install mypackage[lotsofdata]。这将由inextras_require的参数指定。实际的数据加载将是安装后操作,其中使用以下命令从服务器中提取数据setup()setup.pysetup.pywget

我知道如何执行安装后操作

from setuptools.command.install import install

class InstallWrapper(install):
    def run(self):
        install.run(self)
        # post install stuff goes here
        #  if [lotsofdata] option given, install it from server
Run Code Online (Sandbox Code Playgroud)

但我不知道如何访问用户的命令行以查看是否[lotsofdata]给出了该选项。

有人知道如何从安装时代码中获取此信息吗?

self是一个setuptools.command.install类的实例,该类继承自 ,distils.command.install该类继承自distils.cmd.Command。没有明显的方法或属性可以给我我正在寻找的东西,但是代码和文档并不那么容易理解。

这些括号参数的命名似乎不一致,例如“setuptools extras”、“install extras”、“package extras”。“额外”一词在整个 setuptools/distutils 世界中似乎有很多含义。

setuptools pypi setup.py python-packaging

5
推荐指数
0
解决办法
372
查看次数

用诗歌构建的Python包找不到模块

我已经poetry使用构建了一个包poetry build构建了一个包。

\n

这是结构:

\n
\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 pyproject.toml\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 ...\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 some_project\n    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 main.py\n    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 options.py\n    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 helpers.py\n    \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 ...\n\n
Run Code Online (Sandbox Code Playgroud)\n

里面main.py我导入了两个模块

\n
\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 pyproject.toml\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 ...\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 some_project\n    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 main.py\n    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 options.py\n    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 helpers.py\n    \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 ...\n\n
Run Code Online (Sandbox Code Playgroud)\n

它在本地使用 python 运行良好,但是当使用poetryand run 构建时会抛出此错误:

\n
Traceback (most recent call last):\n  File "/usr/local/bin/someproject", line 5, in <module>\n    from some_project.main import main\n  File "/usr/local/lib/python3.9/site-packages/some_project/main.py", line 4, in <module>\n    from options import some_method\nModuleNotFoundError: No module named \'options\'\n
Run Code Online (Sandbox Code Playgroud)\n

还值得一提的是我的pyproject.toml: …

python pip pypi python-packaging python-poetry

5
推荐指数
1
解决办法
5890
查看次数

如何在 setup.cfg 中包含本地 Python 依赖项

以前曾问过类似的问题,但这次我要求提供较新的 setuptools 配置文件 \xe2\x80\x94 setup.cfg

\n

考虑我的用例,我有一个包含多个相互依赖的 Python 包的项目。为了简单起见,我们说mypkg1取决于mypkg2

\n
mypkg1/\n  mypkg1/\n  setup.cfg\nmypkg2/\n  mypkg2/\n  setup.cfg\n
Run Code Online (Sandbox Code Playgroud)\n

如何编写setup.cfg文件以mypkg1使其依赖于 的本地副本mypkg2

\n
[metadata]\nname = mypkg1\nversion = 0.0.1\n\n[options]\npackages = find:\npython_requires = >= 3.7\ninstall_requires =\n    ../mypkg2  # Does not work\n
Run Code Online (Sandbox Code Playgroud)\n

答案不能是分发mypkg2到包存储库(例如,PyPI)或某些 VCS 版本(例如,GitHub 版本),因为这些解决方案使包成为外部的而不是本地的。

\n
\n

相关问题

\n\n

python setuptools python-packaging

5
推荐指数
1
解决办法
1932
查看次数