gpt4 book ai didi

python - 如何轻松制作自己的自定义setup.py命令?

转载 作者:行者123 更新时间:2023-11-28 18:33:05 34 4
gpt4 key购买 nike

在JavaScript项目中,我可以在package.json中指定以下内容:

{
"name": "dredd",
"version": "1.0.4",
"description": "API Blueprint testing tool",
"main": "lib/dredd.js",
"bin": {
"dredd": "bin/dredd"
},
"scripts": {
"lint": "coffeelint ./src",
"pretest": "npm run lint",
"test": "find ./test/ -name '*-test.coffee' | xargs mocha --compilers 'coffee:coffee-script/register' --reporter spec --timeout 120000 --recursive",
...
"coveralls": "./scripts/coveralls.sh",
...
},
"dependencies": {
...

参见 scripts部分。我可以定义任何名称的“脚本”和任何实现。然后我可以将其作为 npm run <name>运行(有些特殊的我甚至可以直接作为 npm <name>运行,例如 npm test)。“脚本”的实现可以只是一个命令或一行,其工作方式与在shell中的工作方式相同(虽然我需要自己实现可移植性, npm对我没有帮助,但这没关系)。NPM正确地传播任何给定的参数,也退出代码。总之,我可以:
定义自定义命令
定义在调用 pre<name>命令之前将始终执行的 <name>命令
这些命令基本上可以是在我的终端上运行的任何东西
它们正确地传播参数并退出代码。
理想情况下,父命令可以列出可用的脚本
所以它类似于 rakemakegruntgulp等等,但是它是内置的,非常简单,非常容易操作。在Python项目中,我错过了这样的东西。我觉得 setup.py是一个文件,它最初是作为Python项目的一个入口点,我喜欢这个想法,我想接受它。理想情况下,我想有这样的东西:
python setup.py test
python setup.py lint
python setup.py <my command>

我想要单一的切入点,因为我希望我的项目是直观的。不应强迫人们阅读文档或 .travis.yml为我的项目运行linter、测试等。他们不需要关心我是使用 nosetests还是 py.test进行测试,还是使用 flake8进行起绒。这是实现细节。
然而,这显然并不容易实现。例如,我希望我的 lint命令在内部包含 flake8和其他内容。然后我希望我的 test命令在运行之前也始终运行 lint
我已经看到了一些通过子类化 Command并在 setup(...)中的 setup.py中声明这样的命令来实现自定义命令的方法,但是我没有找到好的官方文档。此外,许多文章都很旧,很难理解2016年的现状和当前最佳实践,因为历史上有多个项目涉及包装( distutilssetuptoolspipeasy_installpython setup.py --helppython setup.py test,…)即使我能够实现类并调用它并具有在 flake8 && pytest tests上列出的命令,我仍然必须实现子过程部分、退出代码、STDIN、STDRR和参数重定向。这对我的场景来说太复杂了,我想让我的项目保持简单并专注于它自己的目的。
测试框架通常会实现一些重量级自定义命令,这些命令可以设置为 python setup.py test的替代命令。实现在数百行上,如果我想在命令中添加一些内容(例如,如果每次调用 setup.py,我都想 python setup.py test),这似乎是很难实现的。
我见过许多人因命令设计不当而辞职,因为他们太难写了,他们 just do following
# setup.py
if sys.argv[0] == 'test':
# do something

if sys.argv[0] == 'publish':
# do something

setup(...

这很简单,但是它并没有集成到现有的 if sys.argv[0] == 'test':基础设施中,如果我想调用shell命令,我仍然需要自己实现所有的子进程工作。另外,我不确定是否可以轻松地调用原始命令(例如,我想用一些东西来包装 setuptools,所以我将写下 distutils块并做一些自定义的事情,但是之后如何继续测试呢?又一次,找不到文档。
以上两个选项都不容易编写或维护。然而,我不相信有什么比我在Python生态系统中寻找的东西更好。我想我一定错过了什么。有人能给我指个方向吗?至少用 向我解释一下情况,在哪里可以找到所有相关文档?

最佳答案

超简单的赤骨方法。但需要在系统上安装flake8

class Flake8(Command):
def initialize_options(self):
pass

def finalize_options(self):
pass

def run(self):
errno = os.system("flake8 <dir-needing-linting>")
sys.exit(errno)

关于python - 如何轻松制作自己的自定义setup.py命令?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35056440/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com