【问题标题】:How to setup a developer environment for a python project similar to NodeJs如何为类似于 NodeJs 的 python 项目设置开发环境
【发布时间】:2018-05-30 13:13:15
【问题描述】:

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

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

  • 运行测试
  • 运行 pylint
  • 清理 build/dist 目录
  • 使用 setuptools 和 distutils 构建源代码分发
  • 等等等等等等

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

  • 使用pip install -r requirements.txt安装包
  • 激活虚拟环境
  • 触发预提交和预推送 git 挂钩(尚未实现)

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

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

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

【问题讨论】:

  • 不清楚 automate 是什么意思。
  • @hoefling 例如,如果我运行像python setup.py pre-build 这样的命令,那么pylinttestsclean 步骤应该按顺序运行。

标签: python node.js git setuptools setup.py


【解决方案1】:

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

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

$ python setup.py clean test lint sdist build_doc upload

如果工具不提供distutils 命令,例如pylint 不提供,您可能需要额外的依赖项,因此您需要setuptools-lint 包才能使python 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 -lls 命令示例:

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

【讨论】:

  • 这很有意义。还有一个问题,如何将pylint 命令或任何其他自定义命令链接到 setup.py?
  • 首先,如果我没记错的话,你需要pytest-runner 依赖——它为distutils 提供了pytest 命令。安装后,您可以像普通的pytest 一样运行python setup.py pytest。如果您仅使用 pytest 进行测试,您还可以在 setup.cfg 中将 test 别名为 pytest
  • 嗯,afaik 使用普通命令是不可能的,但是编写自己的命令非常容易 - 参见 Extending distutils 的示例。让我用一个小例子来增强答案。
  • 另外,我通过 setup.py 运行 pylint 更新了答案 - 包 setuptools-lint 添加了一个调用 pylint 的 lint 命令。
  • 很高兴我能帮上忙!我添加了一个自定义 distutils 命令的小示例,但当然还有很多可以做的,像往常一样。
【解决方案2】:

如果您愿意为此使用库,paver 是一个选项。文档here 说明了一种在不改变项目中使用 setuptools 的方式的情况下使用 paver 的方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-22
    • 1970-01-01
    • 2021-03-22
    • 2019-12-14
    • 1970-01-01
    • 2017-12-20
    • 2010-11-10
    相关资源
    最近更新 更多