Python项目开发环境的最佳实践(2020版)


引子

如何配置好Python项目是个挺头疼的话题,环境管理用什么,代码整形用什么,代码提交需要做哪些修正等等。pipenv, Makefile, black, isort, mypy, flake8, pre-commit 这些你都知道怎么用吗(doge脸)?

这篇文章就是简单做个总结,介绍一下当下Python项目配置的Best practice。

项目配置

这篇文章主要参考了这里,在此基础上,我添加Makefile等设定,以及介绍了如何在VS Code中进行相应的配置。

使用到的工具

另外一些设定:

  • Shortcut command with Makefile
  • Lint setting in VS code

配置

直接使用这个项目 Python Best Practices Cookiecutter, 在这个项目的基础上,进行了改进。

# 1 Install pipx if pipenv and cookiecutter are not installed
python3 -m pip install pipx
python3 -m pipx ensurepath

# 2 Install pipenv using pipx
pipx install pipenv

# 3 Use cookiecutter to create project from this template
pipx run cookiecutter gh:sourcery-ai/python-best-practices-cookiecutter

# You've downloaded /Users/smap10/.cookiecutters/python-best-practices-cookiecutter before. Is it okay to delete and re-download it? [yes]: 
# project_name [Best Practices]: Best Practices
# repo_name [best_practices]: 
# Project successfully initialized


# 4 Enter project directory
cd <repo_name>

# 5 Create Makefile

# 6 Initialize
make init
  • 1-2: 如果没有安装pipenv和cookiecutter的话,可以安装pipx,从头创建一个新的环境,用于保存pipenv和cookiecutter
  • 3:根据提示符的提示,输入项目的名称。创建成功后,可以更改repo_name,比如best-practices
    • 更改setup.cfg[mypy]里的files
    • 根据需要,在Pipfile里添加必要的库。
    • 还有一些设置,如果不需要的话,可以直接删除配置文件。如果需要的话,更改对应的配置文件。比如.coveragerc里的名称,Dockerfile里的ENTRYPOINT.github里的publish-docker.ymltest.yml
  • 5:创建下面的Makefile,这样就可以使用各种命令了。
  • 6:执行初始化
init:
    git init
    pipenv install --skip-lock --dev
    pipenv run pre-commit install -t pre-commit
    pipenv run pre-commit install -t pre-push

lint:
    pipenv run isort --recursive [package]
    pipenv run black [package]
    pipenv run flake8 [package]
    pipenv run mypy [package]

    pipenv run isort --recursive test
    pipenv run black test
    pipenv run flake8 test
  pipenv run mypy test

test:
    pipenv run pytest --cov=[package] --cov-report=term-missing test

配置VS Code

最后配置vscode,方便在写代码的时候查看提示。

创建.vscode/setting.json,然后输入下面的内容:

{
    // Python environment
    "python.pythonPath": "/Users/smap10/.local/share/virtualenvs/nlp_100_exercises_2020_cookie-0IzMDIm4/bin/python",
    // Saving
    "files.autoSave": "afterDelay",
    "files.autoSaveDelay": 1000,
    // Linter
    "python.linting.enabled": true,
    "python.linting.pylintEnabled": false,
    "python.linting.flake8Enabled": true,
    "python.linting.lintOnSave": true,
    "python.linting.pycodestyleEnabled": false,
    "python.linting.flake8Args": [
        "--ignore=E203,E266,E501,W503",
        "--max-line-length=88",
        "--max-complexity=12"
    ],
    // Formatter
    "python.formatting.provider": "black",
    "editor.formatOnSave": true
}

这里说点题外话,关于vscode的配置方法。根据这里的讨论,配置有4个优先级(由低到高):

  • Default
  • User:$HOME/.config/Code/User/settings.json
  • Workspace:yourwokspace.code-workspace
  • Workspace Folder:.vscode/settings.json

上面添加的.vscode的,就是第四种方法。

一些工具选择的讨论

代码整形工具:autopep8,yapf,black

yapf就不用提了。

我的同事还在用autopep8,他不使用black的理由是black还没有发布正式版,而autopep8很成熟。

我自己也试过两个,感觉还是black好用一些。

环境管理工具:Pipenv、Poetry

其实我平时使用conda管理Python环境的,因为创建一些机器学习和深度学习的环境时,conda可以解决很多依赖问题。

具体到某个项目的时候,比如一些爬虫或者网站时,可以使用Pipenv或Poetry。虽Pipenv构建环境慢,但胜在成熟。

之前我也用过Poetry,主要是因为想把所有设置(Pipfile, setup.cfg)全部都写在pyproject.toml,但是尝试后发现有些不爽的地方:

  • flake8的设置需要单独写到.flake8文件里,这样我还不如用setup.cfg直接写好所有设置呢。
  • Poetry使用起来不直观,这个可能是我还不熟悉的缘故

不过Poetry现在也越来越流行了,毕竟是脱胎于官方的PEP倡导。今后支持的功能应该会更多吧。

欢迎订阅我的博客:RSS feed
知乎: 赤乐君
Blog: BrambleXu
GitHub: BrambleXu
Medium: BrambleXu

延伸阅读

比较有用的文章:

参考即可:


文章作者: BrambleXu
版权声明: 本博客所有文章除特別声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 BrambleXu !
评论
  目录