Mac是最好的Linux,Win也是最好的Linux,只有Linux做不好Linux

儘管條條道路通羅馬,但畢竟有的路走得更平穩更快捷,更不要說有的人甚至就住在羅馬。對於Python開發者而言,你的開發環境有多好用,你離羅馬就有多近。因此,我們的旅程從這裡開始。

本章首先介紹Python開發的操作系統環境,然後介紹幾個最流行的集成IDE,並對他們的特點進行了比較,供讀者選擇。

選擇哪一種操作系統?

看上去操作系統是一個與編程語言無關的話題,特別是像Python這樣的開發語言,它編寫的程序幾乎可以運行在任何一種操作系統上。但是,仍然有一些微妙的差異需要我們去考慮。首先,Python更適合於數據分析、人工智能和後臺開發,而不是用於開發桌面和移動端應用。而無論是大數據分析和人工智能,還是後臺開發,往往都部署在Linux服務器環境下。而且,這些應用所依賴的生態,也往往構建在Linux下(比如大數據平臺和分佈式計算平臺)。一些重要的程序庫,儘管最終可能都會兼容多個操作系統,但由於操作系統之間的差異,它們在不同操作系統下的版本發佈計劃往往是不一樣的。一些開源的程序和類庫往往會優先考慮Linux操作系統,它們在Linux上的測試似乎也更充分。

我們可以舉出很多這樣的例子,比如,量化交易是Python應用最廣泛的領域之一。而pytalib則是其中常用的一個技術分析庫。該庫使用了一個C的模塊,需要在安裝時進行編譯。在Windows下進行編譯,需要下載和配置一系列的Visual C++的編譯工具,對Python程序員而言,這些操作會有一定難度,因爲很多概念都是Python程序員並不熟悉的。而如果你使用的是Linux操作系統,儘管編譯仍然是必須的,但安裝和編譯只需要運行一個腳本即可。

不僅僅是Python程序庫如此。我們需要依賴的各種服務可能也是如此。比如,儘管你可以在Windows機器上安裝桌面版的Docker,然後運行一些Linux容器,但Windows下Docker對資源的利用遠不如在Linux下來得充分 — 它們是在Docker服務啓動時就從系統中划走的,無論當下是否有容器在運行,這些資源都無法被其它Windows程序使用。從根本上講,這種差異是Windows不能提供容器級別的資源隔離造成的。

在本書的後面,我們將講到CI/CD,這些都需要使用容器技術。那時,您將更加體會到使用Linux的種種方便。比如,我們將會使用Github Actions提供的容器來運行測試,但是,因爲授權的問題,免費版的Github CI提供的容器將不包括Windows。

如果這些理由還不能說服您,我們還可以看看多數資深程序員是如何選擇操作系統的。下圖是StackOverflow網站在2022年的一個調查:

從圖中可以看出,如果把Linux自身的使用量與wsl的使用量(WSL也是一種Linux)加在一起,Linux已經是排名第一的操作系統。

基於上述原因,我們推薦使用Linux作爲您開發Python項目的操作系統。本書中提到的工具、示例和程序庫,如非特別提到,也都默認地使用Linux作爲運行環境,並在Linux下測試通過。

但是,您很可能並不會喜歡這個建議,因爲很可能您的電腦就是MacOS或者Windows。

好消息是,MacOS和Linux都是所謂的“類Unix”操作系統,它們之間有極高的相似度。所以,如果您的電腦是MacOS操作系統,您大可不必另外安裝一個Linux。如果您的電腦是Windows操作系統,我們在下面也提供了三種方案,讓您的機器也能運行一個虛擬的Linux操作系統用於開發。

Windows下的Linux環境

在Windows下有三種構建Linux虛擬環境的方式。其中之一是Windows的原生方案,即使用Windows Subsystem for Linux(以下簡稱WSL),其它兩種方案則分別是Docker和虛擬機方案。

WSL方案

WSL是Windows 10的一個新功能。通過WSL,在Windows之上,運行了一個GNU/Linux環境。在這個環境裡,絕大多數Linux命令行工具和服務都可以運行,而不需要設置雙系統,或者承擔虛擬機帶來的額外代價。

當前有兩個版本可用,即v1和v2, 作者更推薦使用v1。WSL v2的體驗更像一臺真正的虛擬機,因此與windows集成性反而更差一些。

安裝WSL

如果您的windows 10是2004及更高版本,或者是Windows 11,則安裝只需要一條命令即可完成:

wsl --install --set-defalut-version=1

這將安裝WSL v1版到您的機器上。如果是稍早一點的系統,則需要執行以下步驟:

1. 首先,啓用“適用於Linux的Windows子系統”功能:

2. 設置後,需要重啓一次電腦。

3. 從Windows應用商店搜索安裝一個Linux發行版,這裡的示例中我們使用Ubuntu:

現在,在搜索欄輸入Ubuntu,就會打開Ubuntu shell。由於是第一次運行,此時會提示我們輸入用戶名和口令。這樣WSL就安裝成功了。此後,也可以從搜索框輸入`wsl`命令來啓動這個系統。

定製WSL

使用WSL v1版本是一種特殊的體驗。它既像一個虛擬機,但又缺乏部分功能,比如,它沒有後臺服務這個概念。我們可以在其中安裝一些服務,比如Redis或者數據庫,但這些後臺服務並不會隨WSL一同啓動,必須得經由我們手動啓動。但是,我們可以通過一些定製,來使得WSL的使用體驗更接近一臺虛擬機。

我們的定製將實現兩個功能,一是讓WSL虛擬機隨Windows自動啓動。二是當WSL啓動後,它能自動運行一個ssh服務,這樣我們就可以隨時連接使用這臺WSL虛擬機。學會這個定製之後,讀者當然也可以讓WSL啓動之後,自動運行更多的後臺服務。

我們需要寫三個腳本,一個start.vbs,一個control.bat和一個commands.txt,並且增加一個開機自動執行的計劃任務。當Windows開機後,這個計劃任務自動執行,調用start.vbs來執行control.bat, 而control.bat則會啓動WSL(及其依賴的Windows服務),並在WSL環境下執行定義在commands.txt中的那些命令--即要在WSL中運行的服務,比如ssh server。整個過程如下圖所示:

首先,我們在commands.txt文件中定義要在WSL中運行的後臺服務:

/etc/init.d/cron /etc/init.d/ssh

然後,我們編寫一個批處理腳本,用以啓動WSL,並執行上述命令:

然後我們編寫一個start.vbs腳本,來執行control.bat:

最後,我們向計劃任務程序中添加一個新的開機啓動任務:

需要說明的是,通過Windows應用商店安裝的Ubuntu子系統,它應該已經安裝好了ssh-server,我們在上述操作中所做的事,只不過是讓它隨WSL一起啓動而已。但是,如果您發現您的WSL中並沒有安裝ssh-server,您也可以自行安裝。畢竟,這就是一臺Linux服務器,您可以在上面安裝Linux上的絕大多數軟件。

通過應用上述方案,您就在Windows上擁有了兩個可以同時運行的操作系統。特別值得一提的是,在您不使用WSL的時候,它只佔用很少的CPU和內存資源(僅限WSL 1.0)。這是其他虛擬化方案所無法比擬的。

在本書寫作時,WSL 2.0已經有了支持圖形化界面的預覽版,稱之爲wslg。未來這個版本將合併到WSL中,隨Windows一起發行的正式版發行。下圖是wslg圖形化界面的一個效果圖:

雖然這與本書的主旨無關,但至少也給了我們一個繼續使用Linux的理由,就連微軟都這麼認真地做Linux了,您還要繼續使用Windows來做開發嗎?