選擇的這些工具將簡化你的 Python 環境,以實現順暢和一致的開發實踐。html
Python 是一門出色的通用編程語言,常常做爲第一門編程語言來教授。二十年來,我爲它撰寫了不少本書,而它仍然是個人首選語言。雖然一般來講這門語言是簡潔明瞭的,可是(正如 xkcd 諷刺的),歷來沒有人說過配置 Python 環境也是同樣的簡單。python
一個複雜的Python環境。 xkcdlinux
在平常生活中有不少使用 Python 的方法。我將解釋我是如何使用這些 Python 生態系統工具的。但坦誠的說,我仍在尋找更好的替代品。git
我發如今機器上運行一個特定版本的 Python 的最好方法是使用 pyenv
。這個軟件能夠在 Linux、Mac OS X 和 WSL2 上工做:這是我一般關心的三個 「類 UNIX」 環境。github
安裝 pyenv
自己有時會有點棘手。一種方法是使用專用的 pyenv 安裝程序,它使用 curl | bash
方法來進行(詳見其說明)。編程
若是你是在 Mac 上(或者你運行 Homebrew 的其餘系統),你能夠按照這裏的說明來安裝和使用 pyenv
。ruby
按照說明安裝和設置了 pyenv
以後,你可使用 pyenv global
來設置一個 「默認的」 Python 版本。通常來講,你會選擇你的 「首選」 版本。這一般是最新的穩定版本,但若是有其餘考慮因素也可能作出不一樣的選擇。bash
使用 pyenv
安裝 Python 的一個好處是,你全部後繼安裝的 Python 解釋器環境都是你本身的,而不是操做系統層面的。app
雖然在 Python 自己內部安裝東西一般不是最好的選擇,但有一個例外:在上面選擇的 「首選」 Python 中,安裝並配置 virtualenvwrapper
。這樣你就能夠瞬間建立和切換到虛擬環境。curl
我在這篇文章中具體介紹瞭如何安裝和使用 virtualenvwrapper
。
這裏我推薦一個獨特的工做流程:你能夠製做一個能夠大量重複運行的虛擬環境,用來作運行器。在這個環境中,能夠安裝你最喜歡的運行器 —— 也就是你會常常用來運行其餘軟件的軟件。就目前而言,個人首選是 tox
。
tox 是一個很好的工具,可讓你的 Python 測試自動化。在每一個 Python 環境中,我都會建立一個 tox.ini
文件。不管我使用什麼系統作持續集成,均可以運行它,我能夠用上面文章中描述的 virtualenvwrapper
的 workon
語法在本地運行一樣的東西:
$ workon runner
$ tox
複製代碼
這個工做流程之因此重要,是由於我要在多個版本的 Python 和多個版本的依賴庫中測試個人代碼。這意味着在 tox
運行器中會有多個環境。一些會嘗試在最新的依賴關係中運行,一些會嘗試在凍結的依賴關係中運行(接下來會有更多的介紹),我也可能會用 pip-compile
在本地生成這些環境。
附註:我目前正在研究使用 nox 做爲 tox
的替代品。緣由超出了本文的範疇,但值得一試。
Python 是一種動態編程語言,這意味着它在每次執行代碼時都會加載其依賴關係。可否確切瞭解每一個依賴項的具體運行版本可能意味着是平穩運行代碼仍是意外崩潰。這意味着咱們必須考慮依賴管理工具。
對於每一個新項目,我都會包含一個 requirements.in
文件,(一般)只有如下內容:
.
複製代碼
是的,沒錯。只有一個點的單行。我在 setup.py
文件中記錄了 「寬鬆」 的依賴關係,好比 Twisted>=17.5
。這與 Twisted==18.1
這樣的確切依賴關係造成了鮮明對比,後者在須要一個特性或錯誤修復時,難以升級到新版本的庫。
.
的意思是 「當前目錄」,它使用當前目錄下的 setup.py
做爲依賴關係的來源。
這意味着使用 pip-compile requirements.in > requirements.txt
會建立一個凍結的依賴文件。你能夠在 virtualenvwrapper
建立的虛擬環境中或者 tox.ini
中使用這個依賴文件。
有時,也能夠從 requirements-dev.in
(內容:.[dev]
)生成 requirements-dev.txt
,或從 requirements-test.in
(內容:.[test]
)生成 requirements-test.txt
。
我正在研究在這個流程中是否應該用 dephell 代替 pip-compile
。dephell
工具備許多有趣的功能,好比使用異步 HTTP 請求來下載依賴項。
Python 的功能既強大又賞心悅目。爲了編寫這些代碼,我依靠了一個對我來講頗有效的特定工具鏈。工具 pyenv
、virtualenvwrapper
、tox
和 pip-compile
都是獨立的。可是,它們各有各的做用,沒有重疊,它們一塊兒打造了一個強大的 Python 工做流。
via: opensource.com/article/20/…
做者:Moshe Zadka 選題:lujun9972 譯者:wxy 校對:wxy