我刚刚启动了一个开放源代码的Python项目,希望有一天它会流行起来。目前要发布新版本,我必须做一些事情。
mypackage.VERSION变量,该变量setup.py从__init__python setup.py sdist bdist_wheelCHANGELOG文件如果我必须用9个要点来总结我对项目的所有不满,我想我们会在一个非常相似的列表中找到。切入的是过去我编了一个新版本号并写了commit / changelog消息,这很痛苦。
我是否可以通过某种方式使这些任务自动化,例如,让GitHub CI可以仅通过提交完成所有任务?
我已经拥有十年的Python经验和一点CI,但是对于打包Python并与PyPI进行积极的交互我还是很陌生。我怀疑我不是唯一一个被手动重复困扰的人,我只是在寻找可以简化此过程的工具(或服务)。
我正在打包一个 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.json为open('data.json', 'r')
我是否搞砸了有关数据文件路径的问题?
我正在尝试寻找是否有办法获取已安装的软件包和版本并检查它是否满足要求规范。
例如,如果我有包 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 项目,该项目使用 pythonnet 和几个 C# dll 作为依赖项。由于我不想将 dll 推送到 git 存储库,因此我调整了 .gitignore 文件。但是,现在 Poetry 不将 dll 包含到 python 包中。
有没有办法强制 Poetry 忽略 .gitignore?
我正在开发一个 Python 包,我不想pip install .每次更改某些内容时都必须继续运行以重新安装我的包。除非我有文件,否则使用-eor--editable似乎不起作用setup.py,也没有--no-use-pep517。pyproject.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,但我不断收到错误消息,指出我的包不是包。
我应该仅使用 pyproject.toml 还是将其与 setup.py 和 setup.cfg 一起使用?或者也许是它们的其他组合。
我找不到这个问题的任何明确答案,所以如果有人能够启发这个问题,我会很高兴。
我有一个 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.
我想避免:
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软件包,我用以下方式将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.py与subprocess.Popen等当前方法的缺点:
什么是规范(如果有的话)或只是一个理智的,可能跨平台的方法来定义Python包的node.js依赖关系,使其可以发布?
为什么这个问题甚至相关?JavaScript不仅仅适用于Web开发(更多).还有一些有趣的(相关的)数据处理工具.如果你不想错过/忽略它们,那么,欢迎来到这种特殊形式的地狱.
我最近遇到了冷静,这似乎是我正在寻找的.我还没有尝试过它,它似乎也是一个相对年轻的项目.
我在那里问了一个类似的问题.
编辑(1):有趣的资源:JavaScript与研究计算 - 对于那些遗憾的必要的人的简要指南
如何在PyPI项目的Project Links部分下添加链接?
这是我的设置
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-packaging ×10
python ×8
setuptools ×4
pip ×3
pypi ×3
setup.py ×2
build ×1
docker ×1
javascript ×1
node.js ×1
npm ×1
package ×1
packaging ×1
python.net ×1
twine ×1