Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何轻松创建自己的自定义setup.py命令?_Python_Shell_Setup.py - Fatal编程技术网

Python 如何轻松创建自己的自定义setup.py命令?

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

在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",
    "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)