我怎样才能轻松地做出自己的习惯呢设置.py命令?

2024-09-24 00:28:58 发布

您现在位置:Python中文网/ 问答频道 /正文

在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)。“script”的实现可以只是一个命令或一行,其工作方式与在shell中的工作方式相同(虽然可移植性是我需要自己实现的东西,npm对我没有帮助,但没关系)。npm正确地传播任何给定的参数和退出代码。总而言之,我可以:

  • 定义自定义命令
  • 定义pre<name>命令,这些命令将始终在调用<name>命令之前执行
  • 这些命令基本上可以是任何在我的终端上运行的命令
  • 它们正确地传播参数和退出代码,开箱即用
  • 理想情况下,父命令可以列出可用的脚本

所以它是类似于rakemakegruntgulp等等,但是它是内置的,非常简单,非常容易操作。我在Python项目中错过了类似的东西。我觉得setup.py是一个文件,它最初是作为Python项目的一个单入口点的,我喜欢这个想法,也愿意接受它。理想情况下,我想要一些类似的东西:

^{2}$

我想要单一入口点,因为我想我的项目是直观的。不应该强迫人们阅读文档或.travis.yml来运行项目的linter、测试等。他们不需要关心我是使用nosetests还是{}进行测试,还是使用flake8进行linting。这是实现细节。在

然而,这显然并不容易实现。E、 我希望我的lint命令内部包含flake8以及其他内容。然后我希望我的test命令在运行之前总是运行lint。在

我见过一些实现自定义命令的方法,即子类化Command,并在setup.py中的setup(...)中声明这样的命令,但我没有找到好的官方文档。而且,很多文章都很旧,很难理解2016年的现状和当前的最佳实践,因为历史上有多个项目在处理打包(distutilssetuptoolspipeasy_install,…)。即使我能够实现类并调用它并在python setup.py --help上列出命令,我仍然必须自己实现子进程部分、退出代码、stdin、stderr和参数重定向。这对我的场景来说太复杂了,我想让我的项目保持简单并专注于它自己的目的。在

测试框架通常实现一些重量级的自定义命令,这些命令可以设置为python setup.py test的替代。实现在数百行上,如果我想在命令中添加一些东西(例如,如果我想在每次调用python setup.py testflake8 && pytest tests),那似乎很难实现。在

我认为很多人很难接受他们的命令:

# setup.py
if sys.argv[0] == 'test':
    # do something

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

setup(...

这很简单,但是它没有集成到现有的setup.py基础设施中,如果我只想调用一个shell命令,我仍然需要自己实现所有的子进程。另外,我不确定是否可以轻松地调用原始命令(例如,我想用某种东西包装python setup.py test),所以我将写下if sys.argv[0] == 'test':块并执行一些自定义操作,但是我如何在以后继续测试呢?同样,找不到与此相关的文档。在

上面的两个选项都不容易编写或维护。然而,我不相信在Python生态系统中没有什么能像我所寻找的那样。我想我一定错过了什么。有人能至少给我指出正确的方向吗?至少用setuptoolsdistutils向我解释一下情况,在哪里可以找到所有相关的文档?在


Tags: 项目代码name文档pytest命令npm
1条回答
网友
1楼 · 发布于 2024-09-24 00:28:58

超简单的基本方法。但是需要在系统上安装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)

相关问题 更多 >