如何構建Python開發環境(1)

在跟我學AI量化交易(1) - 獲取行情資料中提到,這部教程的開發語言是Python,因此不可避免地將涉及Python程式設計知識。這裡發表一些相關的基礎知識,作為輔助入門材料。

工具改變了人本身,也改變著我們的世界。真正的程式設計師不僅擅於構建工具,也擅於使用工具。這篇文章討論瞭如何基於Windows 10構建高效的Python開發環境。

本系列文章共分兩部分。第一部分的內容適合所有人閱讀;第二部分則面向嚴肅的開發者–我們將討論持續整合開發環境的構建。

目標

本期將介紹如何在Windows 10下打造一個無縫連線Windows和Linux的Python開發環境,使得我們可以同時享受到兩個作業系統的便利:

1。 使用Windows圖形介面來執行客戶端程式,包括整合開發環境(Pycharm)和文件寫作工具。

1。 使用Linux來執行和除錯程式碼。許多開源軟體和庫對Linux支援得更好。比如在2017年,在Windows上安裝Redis還是一件比較麻煩的事。開發nodejs的程式設計師也常常發現,在Linux下很多npm包有著絲滑般的安裝體驗,而在Windows上則會是一路跌撞撞。這也是Windows現在大力擁抱Linux的原因之一。在這一部分,我們將介紹WSL。

1。 Python虛擬環境的構建

Windows和相關開發軟體的選擇

無論如何,在2020年你都應該停止使用其它版本的Windows,而只使用最新的Windows 10系統。原因之一是,Windows 10現在提供了最好的Linux發行版,更為奇妙的是,這兩個系統現在可以同時執行,甚至無需切換;兩套系統共存而帶來的效能代價極小,遠遠小於其它方案,諸如虛擬機器或者docker。

如果你閱讀過我三年前的一篇文章, , 可能還有印像,我當時推薦的方案是在Windows中使用Docker。這個方案最大的問題是,Docker後臺程式會固定地將系統的記憶體和CPU資源切走一部分,無論Docker當前實際使用了多少,這無疑造成了資源的浪費。當時已經出現了WSL,但我給出的建議是不要使用!不要使用!不要使用!

現在是時候推薦WSL - Windows Subsystem for Linux了。它現在已經很棒。

WSL - 執行在Windows上的Linux

當前有兩個版本可用,wsl v1和wsl v2, 我個人更推薦使用wsl v1。WSL v2的體驗更象虛擬機器,因此與windows整合性反而更差一些。當然,我得出這個結論是在2020年的5月,也許近半年之後,事情已經大有不同。但無論如何,在本文中,我推薦的是WSL v1。0。對於Python開發是沒有任何問題的;如果用於nodejs或者前端開發,可能要擔心效能問題(因為wsl v1的檔案系統性能不太好,而js開發檔案特別多,小檔案又多)。

安裝WSL

首先要啟用“適用於Linux的Windows子系統”功能:

如何構建Python開發環境(1)

接下來從應用商店搜尋安裝Ubuntu安裝就可以了。

如何構建Python開發環境(1)

現在在搜尋欄輸入ubuntu,就可以進入一個命令列視窗。由於是第一次執行,這裡會提示我們輸入口令。 然後是常規操作,更換apt源為國內源(比如阿里):

如何構建Python開發環境(1)

此外還要對ssh服務進行設定。我們設定ssh服務的目標是為了開機自啟wsl子系統(無視窗模式),這樣我們可以隨時以ssh方式連線進去,就好像我們有了一臺Linux伺服器一樣。也許你安裝的版本已經直接設定好了ssh server,所以這裡我們略過。如果沒有,具體設定可參考Ubuntu的ssh設定。

WSL並不會隨windows一起啟動。這裡我們介紹一種方法,使得當Windows啟動時,wsl也隨之啟動,並可以透過你喜歡的ssh客戶端來連線。

這裡使用的方案是來自於https://github。com/troytse/wsl-autostart。具體操作可見wsl-autostart/README_zh。md at master · troytse/wsl-autostart · GitHub。

如果對使用登錄檔的方式不習慣,也可以透過新增計劃任務來實現開機自啟動。

安裝Windows Terminal

Microsoft最近一系列操作確實很能收買人心。之前Windows上一直沒有一個好的命令列程式,現在我們有了。它支援多標籤視窗,響應速度比我之前使用的cmder要快。我使用cmder很長一段時間了,它有時會在輸入字元時假死,還會常常吞掉鍵入的第一個字元,原因不明。

到此為止,Windows上的Linux子系統就完全配置好了。

WSL與Host機器共享檔案

前面我們已經揭示了WSL檔案系統實際上是掛載到Windows host上的,因此,兩者的檔案系統是互通的。但是路徑很長,也不方便記憶。在WSL 2沒有正式釋出之前,我們將一直遇到這個問題。

但是在WSL中訪問宿主機檔案很容易,它們可以透過/mnt/drive來訪問。比如要從WSL中訪問你的C盤檔案,其目錄是/mnt/c。

在WSL 1中,我們暫不建議直接從Windows檔案系統中訪問WSL的檔案系統,這會導致一些複雜的讀寫許可權和一致性問題。我雖然還沒有遇到丟失資料的情況,但有時候會遇到不能刪除檔案、或者檔案無法讀寫的情況。因此,要始終從WSL中來訪問宿主機檔案系統。

使用哪一個IDE?

目前“唯二”的選擇,就是Pycharm和vscode。如果你已經熟悉Vscode,推薦使用vscode;否則推薦使用Pycharm。當然,如果機器配置略差,也建議使用vscode。使用vscode的另一個好處是,它與wsl有很好的整合性,直接支援將原始碼放置在wsl之中,或者遠端的linux機器之上進行開發,就好像這些檔案仍然在本地一樣。Pycharm專業版儘管有支援這些場景,但它使用的遠端路徑對映方案並不如vscode那麼好用。

作為一款成功的商業軟體,Pycharm對比vscode,目前仍然有以下優勢:

程式碼版本管理。Vscode雖然同樣支援了Git,但到今天為止,它並沒有一個好的基於GUI的三路歸併工具,這使得merge程式碼的效率比較低下。但另一方面,vscode的擴充套件gitlens卻十分好用。Pycharm雖然透過local history和git diff也支援同樣的功能,但在介面介面設計上,感覺不如vscode。

DataView。Pycharm原生支援多種資料格式檢視,比如DataFrame。我沒有尋找過Vscode的外掛,但透過Vscode的原生能力來檢視像DataFrame這樣類似表格的資料,還是比較吃力的。

很多功能開箱即用,無須配置。而在VsCode中你需要安裝一堆擴展才能開始工作,這些擴充套件的配置也是花時間的事。

VsCode具有的優勢:

啟動速度更快,效能佔優

除錯模式下檢視變數值更方便,直接透過REPL視窗,以類似命令列的方式進行求值。與之對比的是,Pycharm中需要開啟一個對話方塊,略顯慢一點。

在遠端除錯的支援上,Pycharm的Community Edition版本不支援(即使是WSL也不支援),而VsCode是可以很好地支援WSL的。所以如果是與Pycharm CE版本相比較,那VsCode是可以勝出這一局的(但仍然在程式碼合併上輸掉一局)。

我的推薦是兩款IDE都要安裝。Python開發使用Pycharm,這個工具相信你會越用越喜歡。而Vscode我用來寫文件(rst, markdown),日誌和管理任務,因為VsCode的啟動速度夠快,相關外掛也夠多。

Python及虛擬環境的安裝

任何一個程式設計師都不可能從頭到腳去自己開發程式的每一個模組。因此,我們必然要借鑑和使用他人的開發成果,同時也希望我們的開發成果被更多的人使用。這樣不可避免地造成一個問題: 如果我們的程式中使用了他人開發的模組,並且使用了它的早期版本;而另一個程式也使用了同樣的模組,但使用的是晚期版本,這時候兩個程式應該如何共存?

這個問題的出現至少可以追溯的Windows的早期。在Windows中,這些共享庫以DLL(動態連結庫)的形態出現。由於不同的版本相互衝突,導致出現了被我們稱為DLL地獄的現象出現。為了解決這個問題,就出現了透過虛擬機器進行執行環境隔離的解決方案,隨後又進化到基於docker進行執行環境隔離的方案。這些都是作業系統層面級的解決方案。

Python是我知道的最早支援虛擬環境的開發語言。開發者可以為自己的應用程式構建單獨的虛擬環境,在這個環境裡,所有的第三方模組都只為這一個應用程式服務,因此它們的版本可以固定下來。在一臺機器中,可以同時存在多個虛擬環境,也可以同時執行基於多個虛擬環境的多個應用程式。

Python中有至少兩種構建虛擬環境的方式,即Virtual Env和Conda。在這一期中,我們主要講基於Conda構建虛擬環境。在持續整合那一部分,則會提到VirtualEnv。這兩種方式都被Pycharm支援。

安裝conda

多數從事資料科學的人會安裝完整的anaconda。這一般會佔用你硬碟上好幾個G的初始空間,並且隨著虛擬環境的建立持續增長。對從事工程開發的人來說,則可以從miniconda開始。兩者的區別是,前者包含了很多科學計算用的工程包,比如numpy, scipy, sklearn等等,還有一個名為spyder的整合開發工具。

Miniconda的下載地址在。一般是50M上下,包含了一個基本的Python直譯器。Miniconda的python版本並不重要,因為後面我們都將為虛擬環境安裝特定版本的Python。

我們將Miniconda安裝到WSL中,因此,我們應該執行下面的命令:

如何構建Python開發環境(1)

如果WSL上沒有安裝curl,請先透過suod apt install curl來安裝。

從anaconda官網上下載miniconda可能較慢,也可以先透過下載工具將上述檔案下載下來,再傳入到WSL中去。

修改源

在繼續建立虛擬開發環境之前,我們先要配置一下conda或者pip。這兩個工具都在中心伺服器及其映象上維護了開源庫的目錄,併為他們提供分發。其中,pip專門用於Python程式分發,conda則還包含了其它軟體。無論使用哪一種,在國內使用時,與apt一樣,都需要更改源,否則安裝速度會很慢,甚至無法安裝成功。

對於初學者,需要了解一下pip。pip是一個python模組;我們一般透過python -m xxx來執行xxx模組,比如啟動一個簡單的http伺服器,我們可以執行:

python -m http。server

一些Python模組支援console script,使得它們可以像linux命令一樣被呼叫(這也是Python與Linux融合的一個思想),比如pip。這就是為什麼你可以直接執行pip命令的原因,它實際上是python的指令碼。

既然pip是一個Python模組,那麼它就對執行它的Python有版本要求,所以如果你遇到無法執行pip的情況,就需要檢查python的版本。我們也可以透過下面的方式來執行pip:

python -m pip install xxx

這種方式下,python就是你的系統路徑下能找到的那個版本。如果出錯,也許這將報出更有意義的診斷資訊。

我們使用cfg4py來更改Conda和Pip的源:

如何構建Python開發環境(1)

我們將得到以下輸出:

如何構建Python開發環境(1)

命令給出了修改conda源的兩種方式和具體的源地址,一組是清華源,一組是中科大源。我們再來看看如何修改pip源:

如何構建Python開發環境(1)

輸出如下:

如何構建Python開發環境(1)

這裡使用了cfg4py這個開源庫。它除了可以幫助我們更改conda,pip的配置之外,還提供了諸如redis, mysql, postgres等連線串配置。cfg4py本身是一個python的配置模組,主要為你的Python程式提供多層次、多環境配置。這個庫也是本文作者開發的,這裡說明一下。 ## 建立虛擬環境 {#建立虛擬環境 } 我們使用conda來建立虛擬環境:

如何構建Python開發環境(1)

上面的命令將在你的miniconda安裝目錄的envs目錄下,建立一個名為your_env_name的資料夾,並將python 3。8及相關檔案安裝到這個目錄下。安裝完成時,conda會提示你使用以下命令:

如何構建Python開發環境(1)

當虛擬環境啟用時,命令提示符一般會顯示為虛擬環境名字;此時執行python,會啟動當前虛擬環境下安裝的Python版本,而此後載入的Python庫,都來自於該虛擬環境下透過conda或者pip命令安裝的庫。

pip並不是conda的一部分,為何能知道將python庫安裝到哪個虛擬環境中去呢?原因是,啟動的Python來自於當前虛擬環境,因此它有所有的資訊,可以將Python庫安裝到正確的位置。

關於conda還有一些常見的命令,這裡一併提一下:

conda env list, 顯示本機上所有的虛擬環境

conda env remove, 移除一個虛擬環境

conda create -n your_virutal_env –clone your_another_env,從另一個已存在的虛擬環境中建立。Conda沒有改名的操作,所以如果要給一個虛擬環境改名,我們可以先clone,再刪除掉舊的虛擬環境。

conda install, 安裝軟體到當前環境

conda search, 查詢是否存在某個軟體

在上面的建立命令中,除了像上面那樣使用CPython發行版外,還可以使用特殊的Python版本,比如Intel發行版:

如何構建Python開發環境(1)

使用Intel版的Python的一個原因是,它可能提供了更強效能的數學計算功能。具體可以看。這對從事資料分析為主的程式設計師還是比較有幫助的。

Jupyter Notebook和JupyterLab

Jupyter Notebook是一個基於網頁的、可以按單元格分步執行的Python開發環境,主要用於探索式程式設計。如果您主要從事的工作是資料分析,應該優先安裝使用Jupyter Notebook:在Jupyter Notebook中,您可以一邊寫文件,同時一邊寫程式碼,程式碼執行結果如果是一張圖的話,也可以直接顯示在網頁中。

現在Jupyter Notebook已經支援視覺化除錯(透過xeus-python外掛)、程式碼提示和自動完成。但是在code jump,refactoring和程式碼管理上還很欠缺。這就限制了它在工程化方面的發展。來自於FastAI的科學家對此作了一些改進,試圖將其打造成一個IDE,提供了程式碼管理、Unittest等功能,但目前來看,仍然無法替代傳統的IDE來進行工程化的程式設計。關於他們的研究,感興趣的可以看。

Jupyter Lab被認為是Jupyter Notebook的下一代版本。在工作區的劃分上,提供了類似於IDE的多個功能區,支援工作區檔案列表等, 同時執行的多個標籤也可以彼此呼叫,因此比Notebook增強了工程化能力。不過基於Web的IDE目前看也都沒有特別亮眼的表現,Jupyter Lab也概莫能外。

總結

本期文章給出了在Windows上從事Python開發的常用環境搭建方法。與其它文章不同的是,本文更注重介紹技術背後的背景,以便知其然,更知其所以然。

純的Windows開發已經不再受人喜歡。因為就連微軟自身也在擁抱Linux,擁抱開源。所以我們的開發環境搭建在Win 10 + WSL之上,可以同時享受到兩種作業系統的便利。使用WSL作為Python程式的除錯和執行環境,因為多數軟體和庫對Linux支援得更好,優先順序更高。

儘管VsCode很優秀,但沒有理由不使用Pycharm,尤其是新人,不應該把時間花在自己一時無法一探究竟的各種外掛的安裝配置上。不使用Pycharm的根本原因只有一個,就是License問題。

從事資料科學的工程師可以使用Jupyter Notebook或者Jupyter Lab。

為你的每一個專案建立一個單獨的conda 虛擬環境,以避免各種庫之間的版本衝突。