如何为类似于 NodeJs 的 python 项目设置开发环境

How to setup a developer environment for a python project similar to NodeJs

背景故事 我有一个 python 项目,它使用 setuptools 来构建源分发。 Pylint 集成用于 运行ning 测试。我来自沉重的 NodeJs 背景。

问题 更改代码后,在分发应用程序之前,我有几个步骤应该是 运行。

还有一些其他要求,例如,

在NodeJs项目中,我可以编写一组shell命令,带有prepost下标在 package.json 文件中,它以非常好的方式完成工作。

目前,对于 python 项目,我正在使用 shell 脚本,该脚本按要求的顺序执行所需的步骤。我想到的另一个选择是 package.json 只是为了处理开发环境。但是听起来不pythonic!

如何以优雅的 pythonic 方式自动执行这些步骤?

After doing changes to the code, I have several steps which should be run before distributing the application.

您可以通过将多个命令参数传递给 setup.py 脚本来链接多个操作:

$ python setup.py clean test lint sdist build_doc upload

如果工具不提供 distutils 命令,例如 pylint 不提供,您可能需要额外的依赖项,因此您需要 setuptools-lintpython setup.py lint 上班。

您可以使用与 Node 项目类似的方式为命令集声明别名。在 setup.py 旁边创建一个 setup.cfg 文件并添加别名:

# setup.cfg
[aliases]
ci=clean test lint sdist build_doc upload

现在上面的命令与

相同
$ python setup.py ci

至于其他的要求,大概Pipenv是最接近node的工具了。它具有简洁的功能,如自动创建和激活项目特定的虚拟环境、从 Pipfile 安装包、锁定依赖版本(类似于 shrinkwrap 命令)等

编辑

您还可以编写自定义命令并将它们绑定到安装脚本中。 ls 命令的示例 运行s ls -l:

from distutils.core import Command
from setuptools import setup


class Ls(Command):

    user_options = []

    def initialize_options(self):
        pass

    def finalize_options(self):
        pass

    def run(self):
        self.spawn(['ls', '-l'])


setup(
    name='spam',
    version='0.1',
    author='nobody',
    author_email='nobody@nowhere.com',
    packages=[],
    cmdclass={'ls': Ls,},
)

现在运行python setup.py ls调用新命令:

$ python setup.py ls
running ls
ls -l
total 8
drwx------  3 hoefling  wheel   96 16 Dez 19:47 
com.apple.launchd.1X84ONyuu4
drwx------  3 hoefling  wheel   96 16 Dez 19:47 
com.apple.launchd.XbjjBY44Mf
drwxr-xr-x  2 root      wheel   64 16 Dez 19:47 powerlog
-rw-r--r--  1 hoefling  wheel  405 16 Dez 19:50 setup.py

如果您可以为此使用库,paver is an option. The documentation here 说明了一种使用摊铺机的方法,而无需更改项目中使用设置工具的方式。