Python 如何轻松创建自己的自定义setup.py命令?
在JavaScript项目中,我可以在我的Python 如何轻松创建自己的自定义setup.py命令?,python,shell,setup.py,Python,Shell,Setup.py,在JavaScript项目中,我可以在我的包.json中指定以下内容: { "name": "dredd", "version": "1.0.4", "description": "API Blueprint testing tool", "main": "lib/dredd.js", "bin": { "dredd": "bin/dredd" }, "scripts": { "lint": "coffeelint ./src", "prete
包.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": {
...
请参阅脚本
部分。我可以定义任何名称和任何实现的任何“脚本”。然后我可以作为npm-run
运行它(一些特殊的我甚至可以直接作为npm
运行,例如npm-test
)。“脚本”的实现可以是一个命令或一行,其工作方式与在我的shell中的工作方式相同(虽然可移植性是我需要自己实现的,npm
对我没有帮助,但没关系)。npm正确地传播任何给定的参数和退出代码。总而言之,我可以:
- 定义自定义命令
- 定义总是在调用
命令之前执行的pre
命令
- 这些命令基本上可以是在我的终端中运行的任何命令
- 它们可以直接正确地传播参数和退出代码
- 理想情况下,父命令可以列出可用的脚本
所以它有点像rake
,make
,grunt
,gulp
,等等,但它是内置的,非常简单,非常容易操作。我在Python项目中错过了类似这样的东西。我觉得setup.py
是一个文件,最初是作为Python项目的单一入口点的,我喜欢这个想法,我也愿意接受它。理想情况下,我想要的是:
python setup.py test
python setup.py lint
python setup.py <my command>
这很简单,但它没有集成到现有的setup.py
基础设施中,如果我只想调用一个shell命令,我仍然需要自己实现所有的子流程工作。此外,我不确定是否可以轻松调用原始命令(例如,我想用一些东西包装python setup.py test
,因此我将写下if sys.argv[0]=='test':
块并执行一些自定义操作,但我如何在之后继续进行测试?同样,我没有找到用于此操作的文档…)
上述两个选项都不容易编写或维护。然而,我不相信我在Python生态系统中所寻找的东西是完全不同的。我想我肯定错过了什么。有人能至少给我指出正确的方向吗?至少向我解释一下使用setuptools
和distutils
的情况,以及在哪里可以找到所有相关文档?超级简单的基本方法。但需要在系统上安装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)
8类(命令):
def初始化_选项(自):
通过
def finalize_选项(自):
通过
def运行(自):
errno=操作系统(“第8页”)
系统退出(错误号)
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)