神級操作!優化​Python開發環境的幾個技巧

  • 2019 年 11 月 15 日
  • 筆記

本文來源編程派

今天看到一篇 Django 聯合創始人(cocreator,姑且這麼叫)的一篇文章,裡面推薦了自己的 Python 開發環境配置,用到了 pyenv、pipx、poetry。還沒準備翻成中文,就發現在本文里都有介紹,因此將本文推薦給大家。

用Python編程式碼體驗極佳,並且隨著新版本的發布越來越好!

對於很多人而言,Python提供的大量免費函數庫、高可讀性的程式和新引入的類型注釋讓很多愛不釋手。

然而,數據科學家特別容易使自己的Jupyter notebook變得龐大而雜亂,或者寫出一些難以理解的python文件。

此外,當一個項目依賴於同一函數庫的不同版本時,常常發生版本衝突。

修復以上問題消耗大量時間,還經常導致其他項目出現問題。必須找到避免這類問題的解決方式,為編寫程式碼提供便利。

在本篇文章中我將詳細介紹常用的工具與技巧,希望能給大家提供幫助。

1

Python開發環境

解釋器:

從使用Python最重要的解釋器開始。你可以只下載最喜歡的Python版本,然後把所有內容放在裡面。

但如果你的程式需要不同版本的Python,或依賴於同一第三方模組的不同版本,並需要在幾個程式之間無縫切換時該怎麼辦?

Pyenv可以解決上述問題。

Pyenv共包含三個工具,下面將介紹其中兩個:pyenv(用於安裝python)和pyenv-virtualenv(用於配置全局工具)。

可通過下方網址安裝pyenv:

curl https://pyenv.run | bash

安裝後,向.bashrc(或.zshrc)文件中添加下方程式碼,使得pyenv可用於設備。

exportPATH="~/.pyenv/bin:$PATH"eval "$(pyenv init -)"eval "$(pyenv virtualenv-init -)"

最後,重啟設備。

現在可以使用pyenv安裝幾乎所有的python解釋器,包括pypy、anaconda。

需要注意的是,pyenv只在電腦上搭建本地python環境。搭建python環境需要多種函數庫。

在Ubuntu系統的電腦上,必須安裝以下函數庫以防止運行出現問題。

sudo  apt-get installbuild-essential libsqlite3-dev sqlite3 bzip2 libbz2-dev  zlib1g-dev libssl-dev openssllibgdbm-dev libgdbm-compat-dev liblzma-dev libreadline-dev libncursesw5-devlibffi-dev uuid-dev

現在,要安裝python解釋器只需要執行以下指令。

pyenv installVERSION_YOU_WOULD_LIKE_TO_INSTALL

可以通過pyenv列出所有可用版本。

pyenv install --list

為了使上述過程更加具體,在此安裝python3.7.5並且設置其為默認的全局解釋器。

pyenv install 3.7.5pyenv global 3.7.5

輸入Python-version指令,螢幕將顯示Python3.7.5。

依賴性關係管理(DependencyManagement)

Python中的依賴性管理是項繁重的工作。有許多工具可以幫助完成這項任務。

我最常使用的工具是Poetry。

Poetry可以幫助你簡單地完成如下工作。

管理項目依賴關係 通過虛擬環境將項目分開 輕鬆構建應用程式與函數庫

推薦通過以下方式安裝poetry:

curl -sSL https://raw.githubusercontent.com/sdispater/poetry/master/get-poetry.py | python

另外一種依賴性管理的方式是使用pip和pyenv-virtualenv指令。

大家可能會問:為什麼不只用pip?

因為只用pip可能會在全局環境中安裝poetry及其依賴項,這可能是你不需要也不想要的。

必要指令如下:

# Create a virtual environmentcalled tools that is based on 3.7.5pyenv virtualenv 3.7.5 tools# Install poetry into the tools virtual envpyenv activate toolspip install poetry# Check installed poetry versionpoetry --version# Leave the virtual envpyenv deactivate# This does not work yetpoetry --version# Add your tools virtual env to the globally available onespyenv global 3.7.5 tools# Now this works and you can start using poetrypoetry --version

在使用poetry創建第一個項目之前,建議先對其進行配置,這樣就可以在項目目錄中的.venv文件夾中創建虛擬環境。

當你使用VsCode或Pycharm這類集成開發環境時就會變得非常方便,因為它們可以立即識別並選擇正確的解釋器。

poetry configsettings.virtualenvs.in-project true

注意:你只需設置一次配置,設置結果將在全局環境保留。

終於完成了使用poetry創建項目的所有準備工作,我把這個項目命名為dsexample,為了展示如何使用poetry,我添加了一個特定版本的pandas庫,以及所有額外需求的fastapi框架。

# Initialze a new projectpoetry new dsexamplecd dsexample# Add modules and create virtual environment.poetry add pandas=0.25 fastapi --extras all# As an example of how you could add a git modulepoetry add tf2-utils --git [email protected]:Shawe82/tf2-utils.git

格式一致性與可讀性(Consistent Formatting and Readability)

現在,已經創建好了項目,即將開始添加程式碼。理想情況下,程式碼庫的格式應該一致,以確保可讀性和可理解性。這將是一個非常沉悶乏味的過程,尤其在還有其他人操作程式碼庫時。

但用Black可以解決上述問題!

Black是一種讓程式設計師在編寫python程式碼時能將精力集中於核心內容的工具。它自動為程式碼添加格式,避免程式設計師手動添加格式。

因為Black的效果非常好,我們把它添加到dsexample中,讓它為所有的文件添加格式。

# We add black as a developmentdependency with --dev as we don't# need it when it comes to productionpoetry add --dev black=19.3b0# Assume we are inside the current toplevel dsexample folderpoetry run black .

好了,現在所有的文件看起來非常整齊了。

類型糾正(Type-Correctness)

自Python3.5開始,類型注釋開始成為標準庫的一部分通過類型注釋,程式碼更好理解,更易維護,不易出錯。

為什麼會不易出錯呢?因為可以靜態地檢查變數和函數的類型是否符合預期。當然,必須是自動完成的。

下面介紹mypy!

Mypy是一種靜態python程式碼檢查器,作用是在錯誤發生之前找到他們。使用poetry向項目中添加mypy並進行程式碼檢查與添加black一樣簡單。

# We add mypy as a developmentdependency with --dev as we don't# need it when it comes to productionpoetry add --dev mypy# Assume we are inside the current toplevel dsexample folderpoetry run mypy .

運行mypy也可能導致很多麻煩。當然,可以將其設置為只對你關心的錯誤發出警告。這可以通過在項目中添加mypy.ini文件實現。

將自動化工具自動化(Automate the Automation)

使用black和mypy,我們不再需要手工為程式碼添加格式,並且可以避免不必要的錯誤。

但是我們仍需要手動使用這兩個工具,這兩個工具不是應該也自動化嗎?

是的!

Pre-commit可以完成一切。

Pre-commit工具是在程式碼提交到倉庫前執行檢查(我默認讀者的程式碼處在git的控制下)。無法通過檢查的程式碼將被拒絕。

這樣程式碼倉庫就永遠不會出現格式不整齊或是未經類型檢查的程式碼,以及任何其他你需要檢查錯誤的程式碼。

現在來安裝pre-commit。

可以使用poetry將其直接安裝在項目里,也可以安裝在本地機器里。我傾向於後者,因為precommit只在本地使用,而不在CI/CD伺服器上。

相反,black和mypy在CI/CD伺服器上運行,因此,將它們添加到項目的dev依賴項是有意義的。

建議使用下面方法通過現有的工具虛擬環境安裝它!

# Install pre-commit into the tools virtual envpyenv activate toolspip install pre-commit# Leave the virtual envpyenv deactivate# As we have already added the tool venv, it will work directlypre-commit --version

要使用pre-commit,首先需要向頂級文件夾中添加一個名為.pre-commit-config.yarm的文件。在該文件里,你需要配置所有應該運行的鉤子。

在mypy與Black的環境下,文件內容如下所示:

repos:-   repo: https://github.com/ambv/black    rev: 19.3b0    hooks:    - id: black      language_version: python3.7-   repo: https://github.com/pre-commit/mirrors-mypy    rev: v0.740    hooks:    - id: mypy

最後,你必須執行以下命令以設置鉤子。

# I assume your are in the toplevel folderpre-commit install

現在,鉤子函數(hook)將在每次提交時運行。Black工具的鉤子函數不僅會檢查格式,還會相應地為文件添加格式。

每次添加新的鉤子函數時,建議一開始在所有文件中手動運行pre-commit,因為它只能作用於上次提交之後更改過的文件。

pre-commit run --all-files

就這樣,對自動化工具的自動化完成了。

2

總結

有很多工具可以幫助你專註於重要的事情。此處只介紹了其中的幾個。當然,還有更多,希望大家學到了新的東西後,可以更加專註於程式碼本身。

Tags: