背景故事 我有一个 python 项目,它使用 setuptools 来构建源代码发行版。 Pylint 集成用于运行测试。我有深厚的 NodeJs 背景。
问题 对代码进行更改后,我有几个步骤应该在分发应用程序之前运行。
- 运行测试
- 运行 pylint
- 清理 build/dist 目录
- 使用 setuptools 和 distutils 构建源代码分发
- 等等等等
还有一些其他要求,例如,
- 使用
pip install -rrequirements.txt
安装软件包 - 激活虚拟环境
- 触发预提交和预推送 git hook(尚未实现)
在 NodeJs 项目中,我可以在 package.json 文件中编写一组带有 pre 和 post 下标的 shell 命令,这可以很好地完成这项工作。
目前,对于 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-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
命令)等。
编辑
您还可以编写自定义命令并将它们绑定(bind)到安装脚本中。运行 ls -l
的 ls
命令示例:
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='<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="cba5a4a9a4afb28ba5a4bca3aeb9aee5a8a4a6" rel="noreferrer noopener nofollow">[email protected]</a>',
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
关于python - 如何为类似NodeJs的python项目设置开发环境,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47847370/