标签: python-packaging

自动化Python软件包发布过程

我刚刚启动了一个开放源代码的Python项目,希望有一天它会流行起来。目前要发布新版本,我必须做一些事情。

  1. 测试所有东西。
  2. 编辑mypackage.VERSION变量,该变量setup.py__init__
  3. python setup.py sdist bdist_wheel
  4. 将变更日志条目写入CHANGELOG文件
  5. 提交我的更改,回显一些更改日志
  6. 标记为发布的标签,再次复制该变更日志条目。
  7. 拖入我的内置文件,以便人们可以从发行版中下载它们
  8. 使用Twine将软件包推到PyPI上
  9. 通过PyPI在我的登台服务器上再次测试。

如果我必须用9个要点来总结我对项目的所有不满,我想我们会在一个非常相似的列表中找到。切入的是过去我编了一个新版本号并写了commit / changelog消息,这很痛苦。

我是否可以通过某种方式使这些任务自动化,例如,让GitHub CI可以仅通过提交完成所有任务

我已经拥有十年的Python经验和一点CI,但是对于打包Python并与PyPI进行积极的交互我还是很陌生。我怀疑我不是唯一一个被手动重复困扰的人,我只是在寻找可以简化此过程的工具(或服务)。

python continuous-integration build pypi python-packaging

10
推荐指数
2
解决办法
429
查看次数

尝试读取 Python 包中的 JSON 文件

我正在打包一个 python 包,我将其称为MyPackage.

包结构为:

MyPackage/
    script.py
    data.json
Run Code Online (Sandbox Code Playgroud)

data.json文件包含读取的缓存数据script.py

我已经想出了如何包含数据文件(使用 setuptoolsinclude_package_data=True并在文件中包含数据文件的路径MANIFEST.in)但是现在当我 pip 安装此包并导入已安装的 MyPackage(当前测试安装pip来自 GitHub 存储库)我得到FileNotFound脚本中使用 MyPackage的异常 (data.json)。但是,我看到该data.json文件确实安装在Lib/site-packages/MyPackage.

通过尝试读取json包中的文件,我在这里做错了吗?

请注意,在script.py我试图读data.jsonopen('data.json', 'r')

我是否搞砸了有关数据文件路径的问题?

python setuptools package python-packaging

10
推荐指数
1
解决办法
2422
查看次数

有没有办法以编程方式确认 python 包版本满足需求说明符?

我正在尝试寻找是否有办法获取已安装的软件包和版本并检查它是否满足要求规范。

例如,如果我有包 pip==20.0.2,我希望程序执行以下操作:

CheckReqSpec("pip==20.0.2", "pip>=19.0.0")  -> True
CheckReqSpec("pip==20.0.2", "pip<=20.1")    -> True
CheckReqSpec("pip==20.0.2", "pip~=20.0.0")  -> True
CheckReqSpec("pip==20.0.2", "pip>20.0.2")   -> False
Run Code Online (Sandbox Code Playgroud)

我发现 pkg_resources.extern.packaging 有 version.parse,这对于比较大于或小于的不同版本很有用,但要求规范可能非常复杂,并且有像 ~= 这样的运算符不是标准数学运算符。

setuptools 文档有这个例子:

PickyThing<1.6,>1.9,!=1.9.6,<2.0a0,==2.4c1
Run Code Online (Sandbox Code Playgroud)

是否有现有的方法可以进行此检查,或者有一种简单的方法可以让我自己进行检查?

编辑: ~= 特别困难,特别是当规格作为变量输入时。* 版本要求也很难弄清楚,因为

 version.parse("20.0.*") == version.parse("20.0.1") # False
 version.parse("20.0.*") < version.parse("20.0.0")  # True 
 version.parse("20.0.*") < version.parse("20.1.1")  # True 
 version.parse("20.0.*") >= version.parse("20.0.0") # False
Run Code Online (Sandbox Code Playgroud)

python pip requirements.txt python-packaging

10
推荐指数
1
解决办法
934
查看次数

如何防止诗歌考虑.gitignore

我正在开发一个 python 项目,该项目使用 pythonnet 和几个 C# dll 作为依赖项。由于我不想将 dll 推送到 git 存储库,因此我调整了 .gitignore 文件。但是,现在 Poetry 不将 dll 包含到 python 包中。

有没有办法强制 Poetry 忽略 .gitignore?

python packaging python.net python-packaging

10
推荐指数
2
解决办法
2682
查看次数

在不使用 setup.py 的情况下开发 Python 包的首选方法是什么?

我正在开发一个 Python 包,我不想pip install .每次更改某些内容时都必须继续运行以重新安装我的包。除非我有文件,否则使用-eor--editable似乎不起作用setup.py,也没有--no-use-pep517pyproject.toml如果我没记错的话,我有一个替代方案,这是现在的首选。那么,现在最好的方法是什么?

我的包只是一个 CLI 脚本,但它从同一目录另一个名为utils.py. 开发时,我不能只从终端手动运行脚本,因为这样我会从行中得到“name_of_package不是一个包from name_of_package.utils import function” 。而如果我只有from utils import function,我可以从终端运行脚本,但是当我pip install运行时,它会说“没有名为utils”的模块。

我确实安装poetry并安装了我的依赖项,运行poetryshell,然后尝试使用 运行我的脚本poetry run /path/to/script.py,但我不断收到错误消息,指出我的包不是包。

pip setuptools setup.py python-packaging python-poetry

10
推荐指数
1
解决办法
5472
查看次数

我应该只使用 pyproject.toml 吗?

我应该仅使用 pyproject.toml 还是将其与 setup.py 和 setup.cfg 一起使用?或者也许是它们的其他组合。

我找不到这个问题的任何明确答案,所以如果有人能够启发这个问题,我会很高兴。

python setuptools pypi python-packaging

10
推荐指数
1
解决办法
1940
查看次数

从 pyproject.toml 安装依赖项,但不安装包

我有一个 python 包,我想将其安装在 docker 文件中。

pyproject.toml 看起来像:

[build-system]
requires = ["setuptools>=61.0"]
build-backend = "setuptools.build_meta"

[project]
name = "bar"
dependencies = [
    "pandas",
]

[project.optional-dependencies]
foo = [
    "matplotlib",
]
Run Code Online (Sandbox Code Playgroud)

...和 ​​Dockerfile:

# ...
WORKDIR /app
COPY . /app
RUN pip install /app
Run Code Online (Sandbox Code Playgroud)

这会在每个构建上安装依赖项(在本例中为pandas),我希望避免这种情况,以节省开发人员的时间,因为 pyproject.toml 很少被触及。

如何仅安装pandas(列出 pyproject.toml 的依赖项)而无需COPY .安装bar.

我想避免:

  • 采用诗歌等其他工具
  • 创建一个requirements.txt并dynamic在pyproject.toml中使用关键字,因为我已经optional-dependencies并且希望将依赖项列表尽可能靠近(即同一文件)。

就像是:

# ...
WORKDIR /app
COPY ./pyproject.toml /app/
RUN pip install --requirements-from /app/pyproject.toml  # <-- HERE …
Run Code Online (Sandbox Code Playgroud)

python pip docker python-packaging pyproject.toml

10
推荐指数
0
解决办法
5572
查看次数

有哪些选项可用于定义具有node.js依赖关系的Python包?

目前,我在本地使用了一些(未发布的)Python软件包,我用以下方式将Linux上的Bash脚本安装(用于开发)到一个激活的(否则为"空")虚拟环境中:

cd /root/of/python/package
pip install -r requirements_python.txt # includes "nodeenv"
nodeenv -p # pulls node.js and integrates it into my virtual environment
npm i -g npm # update npm ...
cat requirements_node.txt | xargs npm install -g
pip install -e .
Run Code Online (Sandbox Code Playgroud)

背景是我有许多node.js依赖项,JavaScript CLI脚本,我的Python代码调用它们.

当前方法的优点:

  • 死简单:依赖于nodeenv所有必需的管道
  • 理论上可以内实现setup.pysubprocess.Popen

当前方法的缺点:

  • 类似Unix的平台只有Bash
  • "很难"分发我的包,比​​如说PyPI
  • 需要一个虚拟环境
  • 如果全局安装包,则可能产生"有趣"的副作用
  • 可能会干扰当前虚拟环境中nodeenv的预先存在的配置/"部署"

什么是规范(如果有的话)或只是一个理智的,可能跨平台的方法来定义Python包的node.js依赖关系,使其可以发布?

为什么这个问题甚至相关?JavaScript不仅仅适用于Web开发(更多).还有一些有趣的(相关的)数据处理工具.如果你不想错过/忽略它们,那么,欢迎来到这种特殊形式的地狱.


我最近遇到了冷静,这似乎是我正在寻找的.我还没有尝试过它,它似乎也是一个相对年轻的项目.

我在那里问了一个类似的问题.


编辑(1):有趣的资源:JavaScript与研究计算 - 对于那些遗憾的必要的人的简要指南


编辑(2):我针对nodeenv启动了一个问题,询问我如何使项目依赖于它.

javascript python node.js npm python-packaging

9
推荐指数
2
解决办法
853
查看次数

9
推荐指数
3
解决办法
505
查看次数

Twine 默认“long_description_content_type”为 text/x-rst

这是我的设置

setup(
    name="`...",
    version="...",
    description=...,
    long_description_content_type="text/markdown",
    long_description=README,
    author="...",

    classifiers=[...],

    packages=["..."],
    include_package_data=True,
)
Run Code Online (Sandbox Code Playgroud)

我使用以下命令来打包我的项目

python setup.py sdist bdist_wheel 
Run Code Online (Sandbox Code Playgroud)

但当我跑步时

twine check dist/*
Run Code Online (Sandbox Code Playgroud)

我收到以下错误

Checking dist\Futshane_TBG-1.0.0-py3-none-any.whl: FAILED
  `long_description` has syntax errors in markup and would not be rendered on PyPI.
    line 9: Error: Unexpected indentation.
  warning: `long_description_content_type` missing. defaulting to `text/x-rst`.
Checking dist\Futshane_TBG-1.0.0.tar.gz: FAILED
  `long_description` has syntax errors in markup and would not be rendered on PyPI.
    line 9: Error: Unexpected indentation.
  warning: `long_description_content_type` missing. defaulting to `text/x-rst`.
Run Code Online (Sandbox Code Playgroud)

当我明显提供了一种类型时,为什么它无法识别所提供的类型?

python python-packaging twine

9
推荐指数
1
解决办法
4692
查看次数