環(huán)境與命令行實(shí)操)
1. 為什么要從 Python 和 Linux 開始1.1 這套組合到底意味著什么看到26期_01_Python Linux這個(gè)標(biāo)題我第一反應(yīng)是這又是一個(gè)面向零基礎(chǔ)開發(fā)者的入門系列課程而且是整個(gè)系列的第一講。Python 和 Linux 放在一起講不是因?yàn)榕嘤?xùn)機(jī)構(gòu)喜歡把兩個(gè)熱門詞拼在一起而是這兩樣?xùn)|西在真實(shí)開發(fā)場(chǎng)景里根本拆不開。我自己這些年接觸過不少剛?cè)胄械耐瑢W(xué)很多人一開始只裝了 Windows裝個(gè) Python 也能跑但一旦需要部署項(xiàng)目、處理定時(shí)任務(wù)、操作服務(wù)器日志、跑數(shù)據(jù)腳本就繞不開 Linux。業(yè)界常說寫代碼在 Windows跑代碼在 Linux這是非常實(shí)際的體驗(yàn)。所謂一期課程的01通常意味著從零開始講不假設(shè)你懂命令行不假設(shè)你配置過環(huán)境甚至不假設(shè)你了解什么是操作系統(tǒng)層面的文件權(quán)限。所以這篇內(nèi)容適合誰適合剛接觸編程、想把 Python 作為第一門語言同時(shí)想搞懂它和 Linux 如何協(xié)作的同學(xué)。也適合那些已經(jīng)會(huì)寫一點(diǎn) Python 但從來沒在 Linux 下部署過東西的初級(jí)開發(fā)者。你可以把它當(dāng)作整個(gè)入坑路線的第一站。1.2 剛開始最需要解決的三個(gè)問題我在帶新手的過程中發(fā)現(xiàn)Python 和 Linux 入門階段最難的不是語法而是幾個(gè)非?;A(chǔ)卻繞不開的問題。第一個(gè)是環(huán)境問題。Python 有 2 和 3 的區(qū)別有不同版本有系統(tǒng)自帶的 Python 和手動(dòng)安裝的 Python如果沒搞清楚這些共存關(guān)系后面安裝包、跑腳本會(huì)出現(xiàn)大量看起來莫名其妙的問題。第二個(gè)是工具鏈問題。很多人知道用 pip但不知道為什么同一個(gè)項(xiàng)目在這臺(tái)機(jī)器能跑、換臺(tái)機(jī)器就掛更不知道虛擬環(huán)境存在的意義。第三個(gè)是感覺問題。Linux 的命令行一打開就是黑底白字沒有任何圖形界面提示新手第一反應(yīng)是我該干什么。這需要一個(gè)循序漸進(jìn)的場(chǎng)景來引導(dǎo)而不是直接丟一本命令大全。這篇文章的思路就是圍繞這三個(gè)問題展開先把 Linux 環(huán)境跑起來再把 Python 環(huán)境理清楚最后讓兩者在真實(shí)的小任務(wù)里配合起來。讀完你會(huì)有一種原來如此的感覺而不是背了一堆命令。2. 內(nèi)容整體設(shè)計(jì)與思路拆解2.1 為什么把 Linux 擺在 Python 前面很多零基礎(chǔ)的課程會(huì)先講 Python 語法再補(bǔ) Linux但這里的設(shè)計(jì)順序反過來了先讓大家在 Linux 里待著邊操作熟悉命令邊引入 Python。這個(gè)安排是有道理的。先學(xué)一點(diǎn)點(diǎn) Linux 基礎(chǔ)比如 cd、ls、mkdir、vim 這幾個(gè)命令后面在寫 Python 的時(shí)候會(huì)非常自然地把文件路徑、目錄結(jié)構(gòu)、執(zhí)行權(quán)限這些東西串聯(lián)起來。反過來如果你先用 Windows 寫 Python 寫了一個(gè)月突然切換到 Linux光是文件路徑的風(fēng)格差異和命令行的操作習(xí)慣就夠你適應(yīng)好一陣子學(xué)習(xí)曲線反而更陡。我自己試過一次快速切換教學(xué)方案讓零基礎(chǔ)學(xué)員先花三天熟悉 Linux 終端每天都用命令行創(chuàng)建文件、移動(dòng)文件、編輯腳本然后再開始寫 Python。結(jié)果這些人后面遇到路徑拼接、跨平臺(tái)部署問題的時(shí)候理解速度明顯快過那些從 Windows 直接起步的人。因?yàn)?Linux 命令行天生就逼著你理解文件在哪里哪個(gè)程序在跑這些底層概念寫代碼時(shí)思路會(huì)更踏實(shí)。2.2 方案選型哪種 Linux 更合適對(duì)于剛接觸 Linux 的同學(xué)選發(fā)行版確實(shí)是個(gè)容易糾結(jié)的事情。我的建議非常直接如果你是為了跟課程、打基礎(chǔ)用 Ubuntu 或者 Debian 系就好原因是生態(tài)成熟、資料多、包管理器簡(jiǎn)單。日常中無論是安裝 Python 相關(guān)的系統(tǒng)依賴庫(kù)還是安裝 Nginx、Redis 這類服務(wù)apt 一條命令基本都能搞定出問題的時(shí)候網(wǎng)上也有大量現(xiàn)成答案。很多初學(xué)者會(huì)問為什么不直接上 CentOS 或者更小眾的發(fā)行版不是不能但沒必要。入門階段不要給自己增加額外的環(huán)境差異成本。實(shí)際工作生產(chǎn)環(huán)境用什么發(fā)行版那是公司架構(gòu)師考慮的事情你自己學(xué)習(xí)階段先把用 Linux 干活這個(gè)手感練出來更重要。我的建議是在虛擬機(jī)里裝一個(gè) Ubuntu Server 版本沒有桌面環(huán)境逼迫自己在純命令行下完成操作。很多人怕命令行但 Python 開發(fā)也好、后續(xù)的腳本部署也好日常操作都是在純命令行下完成的早適應(yīng)早受益。2.3 環(huán)境隔離意識(shí)要從第一天建立再來說說虛擬環(huán)境。這是整個(gè)入門過程中我認(rèn)為最應(yīng)該被提前灌輸、卻總被忽略的點(diǎn)。很多初學(xué)者裝好 Python 后不管三七二十一pip install 直接裝全局。這個(gè)習(xí)慣一開始看起來沒問題但一旦你同時(shí)維護(hù)兩三個(gè)小項(xiàng)目就會(huì)出現(xiàn)版本沖突A 項(xiàng)目用 2.x 版本的庫(kù)B 項(xiàng)目需要 3.x 版本你在系統(tǒng)環(huán)境里裝一個(gè)新版本可能就把 A 項(xiàng)目弄掛了。虛擬環(huán)境解決的就是同一個(gè) Python 解釋器但每個(gè)項(xiàng)目用獨(dú)立的包空間這個(gè)問題。第一天就建立這個(gè)習(xí)慣并不難后面會(huì)減少大量不必要的麻煩。我見過不少同學(xué)因?yàn)榄h(huán)境混亂把半天時(shí)間花在排查為什么那個(gè)項(xiàng)目跑不了了上最后發(fā)現(xiàn)只是裝了一個(gè)別的項(xiàng)目的依賴這種冤枉時(shí)間完全可以通過從一開始就建虛擬環(huán)境來避免。3. 核心細(xì)節(jié)解析與實(shí)操要點(diǎn)3.1 虛擬機(jī)還是 WSL動(dòng)手之前得先解決我的 Linux 在哪兒跑的問題。目前對(duì)于 Windows 用戶來說方案大致有三種安裝虛擬機(jī)軟件再裝 Linux、使用 Windows 自帶的 WSL、或者直接找一臺(tái)閑置電腦裝雙系統(tǒng)。WSL 是目前我比較推薦的入門方式因?yàn)樗幌裉摂M機(jī)那樣需要預(yù)分配內(nèi)存和磁盤、啟動(dòng)速度也快你可以直接在 Windows 桌面環(huán)境里面打開一個(gè) Linux 終端和本地文件系統(tǒng)之間的交互也方便。但 WSL 也有一個(gè)短板如果你后面要學(xué) Linux 系統(tǒng)管理、內(nèi)核相關(guān)的東西WSL 畢竟還是偏用戶層的模擬和真正的 Linux 服務(wù)器會(huì)有一些細(xì)微差異。虛擬機(jī)方案比如常見的 VirtualBox 配合 Ubuntu更接近一臺(tái)真實(shí)的 Linux 機(jī)器網(wǎng)絡(luò)、存儲(chǔ)、權(quán)限這些邏輯和服務(wù)器更一致。缺點(diǎn)是資源占用大、啟動(dòng)慢對(duì)電腦配置有一定要求。如果你的電腦內(nèi)存小于 8GB跑虛擬機(jī)會(huì)有點(diǎn)吃力那就優(yōu)先考慮 WSL。我自己做教學(xué)的時(shí)候一般建議電腦配置夠的同學(xué)直接用虛擬機(jī)配置緊張的同學(xué)先用 WSL兩條路都不影響后續(xù)學(xué)習(xí)。3.2 裝好之后首先該做什么假設(shè)你已經(jīng)裝好了一個(gè) Ubuntu 環(huán)境登錄進(jìn)去拿到一個(gè)命令行終端。按照我自己的習(xí)慣新環(huán)境到手做三件事第一更新系統(tǒng)軟件源和已有軟件包。Ubuntu 初始狀態(tài)下用sudo apt update和sudo apt upgrade把系統(tǒng)包更新到最新這一步能避免后續(xù)裝軟件時(shí)遇到依賴版本過舊的問題。第二安裝基礎(chǔ)工具包。比如build-essential、curl、git、vim。這些工具不一定馬上全用上但在后面編譯 Python 擴(kuò)展、拉代碼、改配置文件的時(shí)候一定會(huì)需要。提前裝好省得半路卡殼。第三確認(rèn)自帶 Python 狀態(tài)。Ubuntu 22.04 和 24.04 系統(tǒng)默認(rèn)帶了 Python 3.10 或 3.12你可以直接執(zhí)行python3 --version查看。這里注意一點(diǎn)系統(tǒng)自帶的 Python 盡量不要?jiǎng)h除或替換因?yàn)橄到y(tǒng)的很多管理工具依賴它。后面我們會(huì)用別的方式管理 Python 版本。3.3 文件結(jié)構(gòu)與命令的記憶方法Linux 的學(xué)習(xí)里最容易讓人挫敗的就是命令太多記不住。這里我的觀點(diǎn)是不要背要用。你只需要先掌握一條主線剩下的隨用隨查就行。主線命令大概就是pwd看當(dāng)前目錄、ls查看目錄內(nèi)容、cd切換目錄、mkdir創(chuàng)建目錄、touch創(chuàng)建空文件、cat查看文件內(nèi)容、rm刪除文件、cp復(fù)制文件、mv移動(dòng)或重命名文件。這些命令涉及了文件和目錄的整個(gè)生命周期日常 80% 的操作都被覆蓋了。至于權(quán)限管理、進(jìn)程管理、網(wǎng)絡(luò)查詢那些等用到了再針對(duì)性地學(xué)效果反而好。記憶方法和小時(shí)候記單詞類似每次操作的時(shí)候想想這個(gè)命令是哪個(gè)英文單詞的縮寫。比如ls是 list列出、pwd是 print working directory打印當(dāng)前工作目錄、mkdir是 make directory建目錄。理解了詞源你會(huì)發(fā)現(xiàn)命令的本質(zhì)就是告訴系統(tǒng)對(duì)你指定的東西做某個(gè)操作。3.4 權(quán)限概念為什么重要很多新手在 Linux 下執(zhí)行腳本的時(shí)候會(huì)碰到一個(gè)報(bào)錯(cuò)Permission denied中文意思就是沒權(quán)限。這個(gè)報(bào)錯(cuò)背后的原因是 Linux 的權(quán)限模型和 Windows 差別很大。Linux 系統(tǒng)里每個(gè)文件都有屬主和屬組的概念并且對(duì)文件的操作權(quán)限分為讀、寫、執(zhí)行三種分別用 r、w、x 表示。當(dāng)你試圖運(yùn)行一個(gè)沒有執(zhí)行權(quán)限的 Python 腳本時(shí)系統(tǒng)就會(huì)明確拒絕你。這在 Windows 下是沒有的體驗(yàn)因?yàn)?Windows 默認(rèn)對(duì)文件可執(zhí)行性的判斷更多看擴(kuò)展名。我見過很多新手在這個(gè)地方栽跟頭明明代碼是對(duì)的但運(yùn)行報(bào)錯(cuò)然后花大量時(shí)間去檢查代碼實(shí)際上只是忘記給腳本加執(zhí)行權(quán)限。避免這個(gè)問題很簡(jiǎn)單要么用python3 script.py的方式直接調(diào)用腳本此時(shí)不依賴腳本的可執(zhí)行權(quán)限要么用chmod x script.py賦予執(zhí)行權(quán)限。理解權(quán)限模型的本質(zhì)是 Linux 入門階段必須跨過的一道坎。4. 實(shí)操過程與核心環(huán)節(jié)實(shí)現(xiàn)4.1 第一步建立項(xiàng)目目錄我們用一個(gè)具體的小任務(wù)來演示創(chuàng)建第一個(gè) Python 項(xiàng)目并且在其中跑通一段腳本。打開終端在 home 目錄下建立一個(gè)名為first_project的項(xiàng)目文件夾cd ~ mkdir first_project cd first_project這里~代表當(dāng)前用戶的家目錄對(duì)新手來說記住這個(gè)符號(hào)很有用因?yàn)樗且粋€(gè)絕對(duì)路徑的快捷方式。在 Linux 下目錄決定一切你的項(xiàng)目在哪里、腳本在哪里、日志在哪里都要有清晰的規(guī)劃。先建一個(gè)專用目錄避免把所有零散文件堆在根目錄或用戶目錄下這是良好習(xí)慣的開始。4.2 第二步搭建 Python 虛擬環(huán)境創(chuàng)建好項(xiàng)目目錄后在里面建立虛擬環(huán)境。我這里假設(shè)系統(tǒng)已經(jīng)安裝了 python3-venv 這個(gè)組件如果沒有先執(zhí)行sudo apt install python3-venv然后創(chuàng)建虛擬環(huán)境并激活它python3 -m venv venv source venv/bin/activate激活之后命令行前面通常會(huì)出現(xiàn)一個(gè)(venv)的提示符代表你當(dāng)前正處在虛擬環(huán)境中。在這個(gè)狀態(tài)下安裝的所有 Python 包都會(huì)進(jìn)到這個(gè)項(xiàng)目獨(dú)立的目錄里不會(huì)污染全局環(huán)境。這一步非常重要也是整個(gè)入門過程里最應(yīng)該形成肌肉記憶的環(huán)節(jié)之一。如果哪一天你忘記了為什么創(chuàng)建虛擬環(huán)境可以回想這個(gè)例子項(xiàng)目 A 需要requests2.25 版本項(xiàng)目 B 需要requests2.31 版本如果不用獨(dú)立環(huán)境兩個(gè)需求是沒法共存在一個(gè)全局環(huán)境里的。用虛擬環(huán)境各裝各的互不影響。4.3 第三步編寫第一個(gè)真正的腳本虛擬環(huán)境就緒之后我們寫一個(gè)不是 hello world 的小腳本但也不復(fù)雜。我傾向于寫一個(gè)帶點(diǎn)實(shí)際處理邏輯的小程序比如批量重命名某個(gè)目錄下的文件。這個(gè)任務(wù)用到 Linux 的目錄操作和 Python 的文件處理能力正好把前面知識(shí)都串起來。先用touch創(chuàng)建幾個(gè)文本文件模擬場(chǎng)景touch report_2024_old.txt touch report_2023_old.txt touch report_2022_old.txt現(xiàn)在目標(biāo)是把這些文件名字里的_old去掉改成report_2024.txt這種格式。用 Python 實(shí)現(xiàn)方式如下# rename_files.py from pathlib import Path target_dir Path(.) for old_file in target_dir.glob(*.txt): if _old in old_file.name: new_name old_file.name.replace(_old, ) old_file.rename(new_name) print(f重命名: {old_file.name} - {new_name})保存文件后運(yùn)行python3 rename_files.py這個(gè)腳本的核心是pathlib這個(gè)標(biāo)準(zhǔn)庫(kù)它提供了一種面向?qū)ο蟮姆绞絹聿僮魑募湍夸浐?Linux 的文件系統(tǒng)概念天然契合。新手容易在這里犯的一個(gè)錯(cuò)誤是直接用字符串拼路徑但跨平臺(tái)時(shí)路徑分隔符不一樣用pathlib可以很好地規(guī)避這類問題。4.4 第四步用 Shell 思維配合 Python再擴(kuò)展一步我們?cè)诮K端里用一條命令看看結(jié)果ls -la你會(huì)看到文件確實(shí)被重命名了。這時(shí)可以引出一個(gè)很有意思的思維Linux 的命令和 Python 腳本常常是配合使用的。比如你想對(duì)項(xiàng)目里所有 Python 文件做一個(gè)簡(jiǎn)單的代碼統(tǒng)計(jì)可以直接用 Shell 命令wc -l *.py但不做復(fù)雜統(tǒng)計(jì)的話用 Python 處理更靈活。比如統(tǒng)計(jì)哪個(gè)文件行數(shù)最多可以寫幾行腳本from pathlib import Path lines_count {} for py_file in Path(.).glob(*.py): lines_count[py_file.name] len(py_file.read_text().splitlines()) print(max(lines_count, keylines_count.get))這就是用 Python 增強(qiáng) Shell用 Shell 增強(qiáng) Python 的日常使用的典型場(chǎng)景。整個(gè)開發(fā)過程不應(yīng)該是必須全用命令行或者必須全寫腳本而是兩者結(jié)合哪個(gè)方便用哪個(gè)。4.5 第五步安裝第三方庫(kù)一個(gè)只依賴標(biāo)準(zhǔn)庫(kù)的 Python 項(xiàng)目畢竟有限。我們?cè)傺菔疽幌碌谌綆?kù)的安裝。虛擬環(huán)境中安裝通常直接使用 pippip install requests然后寫一個(gè)簡(jiǎn)單的網(wǎng)絡(luò)請(qǐng)求腳本測(cè)試它import requests resp requests.get(https://httpbin.org/get) print(resp.status_code) print(resp.text[:200])這里要注意HTTP 請(qǐng)求涉及外網(wǎng)如果網(wǎng)絡(luò)環(huán)境受限可能超時(shí)選一個(gè)你本地網(wǎng)絡(luò)能訪問的接口即可。這個(gè)例子只是為了展示安裝庫(kù)—導(dǎo)入庫(kù)—使用庫(kù)的完整鏈路。另外提醒一下如果你看到pip不是最新版本的提示可以先用pip install --upgrade pip更新一下。但是注意不要隨意升級(jí)系統(tǒng)級(jí) pip最好在虛擬環(huán)境內(nèi)操作。4.6 第六步把腳本變成可執(zhí)行文件最后我們把寫好的腳本變成一個(gè)可以從命令行直接執(zhí)行的文件而不是每次都用python3 script.py調(diào)用。在腳本第一行加上 shebang 標(biāo)記#!/usr/bin/env python3然后賦予執(zhí)行權(quán)限chmod x rename_files.py現(xiàn)在你可以直接執(zhí)行./rename_files.py這個(gè)做法在部署腳本到服務(wù)器時(shí)特別常用也是 Linux 下管理小工具的標(biāo)準(zhǔn)姿勢(shì)。你可能會(huì)看到很多開源項(xiàng)目的命令工具都是這樣設(shè)計(jì)入口的。理解了這個(gè)原理后面看別人項(xiàng)目的啟動(dòng)腳本就不會(huì)發(fā)怵。5. 常見問題與排查技巧實(shí)錄5.1 命令找不到command not found這是最常見的一類問題。大概率原因是你輸入的命令名不對(duì)或者這個(gè)軟件還沒安裝。比如你輸入pythonUbuntu 上默認(rèn)系統(tǒng)只裝了python3這時(shí)候就會(huì)提示 command not found。解決辦法是先確認(rèn)自己到底裝了哪個(gè)版本ls /usr/bin/python*可以看系統(tǒng)中有哪些 Python 相關(guān)程序。如果沒有安裝可以用sudo apt install python3來裝。這類問題不需要死記關(guān)鍵是理解命令來自于系統(tǒng)中的可執(zhí)行程序文件這個(gè)底層邏輯你敲下的每一個(gè)命令都是在系統(tǒng)路徑的某個(gè)目錄里尋找對(duì)應(yīng)的可執(zhí)行文件。5.2 虛擬環(huán)境激活后 pip 仍是全局的有時(shí)候你明明激活了虛擬環(huán)境但是敲pip時(shí)發(fā)現(xiàn)并不是虛擬環(huán)境內(nèi)的版本。通常是因?yàn)槟阍?jīng)在~/.bashrc或者某個(gè)配置里設(shè)置了別名或者激活的環(huán)境變量沒有被正確優(yōu)先級(jí)處理。排查方法很簡(jiǎn)單執(zhí)行which pip看輸出路徑。如果路徑指向/usr/bin/pip而不是虛擬環(huán)境目錄下的venv/bin/pip說明你用的不是虛擬環(huán)境里的 pip。這種情況下重新檢查激活命令source venv/bin/activate然后再次運(yùn)行which pip正常情況會(huì)指向虛擬環(huán)境目錄。養(yǎng)成用which驗(yàn)證的習(xí)慣能幫你快速定位各種命令行為不對(duì)的問題。5.3 安裝包時(shí)出現(xiàn)外部管理環(huán)境錯(cuò)誤新版 Ubuntu 里系統(tǒng) Python 的 pip 被限制安裝了因?yàn)樗詭У?Python 環(huán)境受系統(tǒng)包管理器管控。如果你執(zhí)行pip install requests時(shí)遇到externally-managed-environment這樣的報(bào)錯(cuò)不用慌張。最優(yōu)解是先建虛擬環(huán)境再在虛擬環(huán)境內(nèi)部安裝這樣繞開系統(tǒng)級(jí)別限制也符合項(xiàng)目隔離的理念。如果你確實(shí)需要全局安裝且知道自己在做什么可以加--break-system-packages參數(shù)但我不推薦新手這樣做。這個(gè)錯(cuò)誤本質(zhì)上是一個(gè)保護(hù)機(jī)制告訴你別動(dòng)系統(tǒng)環(huán)境實(shí)際上是在幫你養(yǎng)成好習(xí)慣。5.4 文件權(quán)限導(dǎo)致的運(yùn)行失敗前面提過 Permission denied 的問題。不少同學(xué)寫完 Python 腳本一執(zhí)行./script.py就遇到這個(gè)錯(cuò)誤。排查步驟很簡(jiǎn)單先執(zhí)行l(wèi)s -l script.py查看文件的權(quán)限位。如果顯示的權(quán)限是-rw-r--r--說明屬主沒有執(zhí)行權(quán)限就需要chmod x script.py來補(bǔ)上。還有另一種情況你在 Windows 下用編輯器寫好的腳本傳到 Linux 里發(fā)現(xiàn)運(yùn)行報(bào)錯(cuò)/usr/bin/env: python3\r: No such file or directory。這是因?yàn)?Windows 保存的文件換行符是\r\nLinux 只識(shí)別\n。解決辦法是用sed -i s/\r$// script.py去掉回車符或者在編輯器里把換行符改成 LF。這類問題是 Windows 和 Linux 混用的初學(xué)者最容易踩的坑。5.5 端口被占用的問題過幾天你會(huì)開始寫 Web 服務(wù)比如 Flask 或 FastAPI 的小項(xiàng)目這時(shí)候大概率會(huì)遇到端口被占用的問題。報(bào)錯(cuò)內(nèi)容是類似Address already in use。排查方法是先用ss -ltnp看當(dāng)前監(jiān)聽端口的進(jìn)程找到對(duì)應(yīng)的 PID 之后用kill命令結(jié)束它。這里我的建議是不要直接殺掉系統(tǒng)里不認(rèn)識(shí)的進(jìn)程得先看清楚這個(gè)進(jìn)程是什么、能不能殺。確認(rèn)后才能執(zhí)行清理操作。如果只是為了開發(fā)可以直接使用另一個(gè)端口。這個(gè)排查思路對(duì)所有某個(gè)端口起不來的問題都適用。5.6 常見問題速查表為了方便隨時(shí)翻閱我把上面這些情況整理成一個(gè)速查表現(xiàn)象可能原因快速排查解決辦法command not found軟件未安裝或命令名錯(cuò)誤ls /usr/bin/命令*安裝對(duì)應(yīng)軟件或換正確命令Permission denied文件缺執(zhí)行權(quán)限ls -l 文件名chmod x 文件名換行符導(dǎo)致的報(bào)錯(cuò)文件是 Windows 格式cat -v 文件名sed -i s/\r$// 文件名pip 裝包受限制系統(tǒng) Python 受管理which pip創(chuàng)建虛擬環(huán)境再安裝端口被占用另一進(jìn)程占用端口ss -ltnp換端口或結(jié)束對(duì)應(yīng)進(jìn)程虛擬環(huán)境失效未正確激活或配置沖突which pip重新source activate并檢查5.7 兩個(gè)排查思路層面的建議最后補(bǔ)充兩個(gè)我自己總結(jié)的排查哲學(xué)。第一遇到問題先看報(bào)錯(cuò)信息本身。報(bào)錯(cuò)信息里往往已經(jīng)告訴了你原因和位置不要急著去改代碼或重新安裝環(huán)境。新手最常犯的毛病是看到報(bào)錯(cuò)就慌然后卸載重裝。其實(shí)大多數(shù)問題都是一行命令就能解決的小事情。第二學(xué)會(huì)用最小復(fù)現(xiàn)去定位問題。如果你不知道 bug 出在哪就創(chuàng)建一個(gè)最簡(jiǎn)腳本逐步添加邏輯看哪一步觸發(fā)問題。這個(gè)思路不只是排查技巧也是調(diào)試代碼和設(shè)計(jì)系統(tǒng)的核心思維。很多經(jīng)驗(yàn)豐富的開發(fā)者之所以解決問題快不是因?yàn)橛洃浟枚且驗(yàn)樗麄兌冒汛髥栴}拆成小步驟逐一驗(yàn)證。6. 經(jīng)驗(yàn)感想與后續(xù)路徑6.1 我踩過的一些坑說幾個(gè)我早期學(xué)習(xí) Python 和 Linux 時(shí)印象深刻的經(jīng)歷也算給你們提個(gè)醒。最開始我用的是 Windows裝了一個(gè)很老版本的 Python然后按照網(wǎng)上教程裝了一堆包。后面配合 Linux 使用時(shí)發(fā)現(xiàn)很多命令行為不一致最后才明白是 Python 版本差異造成的。當(dāng)時(shí)浪費(fèi)了一個(gè)下午排查一個(gè)同一個(gè)代碼兩個(gè)環(huán)境結(jié)果不一樣的問題?,F(xiàn)在回想起來如果早點(diǎn)用虛擬環(huán)境、早點(diǎn)統(tǒng)一版本可能五分鐘就解決了。后來我慢慢形成一個(gè)習(xí)慣每個(gè)新項(xiàng)目的第一件事是寫好說明文檔把 Python 版本、系統(tǒng)版本、依賴包列表記清楚。有了這份說明書項(xiàng)目在任何新環(huán)境上都能快速重建。你們現(xiàn)在可能覺得這個(gè)動(dòng)作多余但等到你同時(shí)維護(hù)三個(gè)項(xiàng)目、并且每隔幾個(gè)月就要換電腦或重裝系統(tǒng)的時(shí)候會(huì)發(fā)現(xiàn)它是真正的救命稻草。6.2 下一步可以怎么走這一期內(nèi)容屬于整個(gè)路線的起步覆蓋了 Linux 基本操作、Python 環(huán)境搭建、虛擬環(huán)境、簡(jiǎn)單腳本以及常見問題排查。接下來我認(rèn)為有兩個(gè)明確方向可以繼續(xù)深入。第一個(gè)方向是繼續(xù)加深 Python 的項(xiàng)目能力。比如用 Flask 寫一個(gè)簡(jiǎn)單的 Web 接口再把前面學(xué)的 Shell 命令和 Python 腳本結(jié)合起來做一個(gè)自動(dòng)化的定時(shí)任務(wù)。第二個(gè)方向是往部署方向走學(xué)會(huì)用 Git 管理代碼再把項(xiàng)目部署到一臺(tái)遠(yuǎn)程服務(wù)器上讓它的服務(wù)真的跑起來。這兩個(gè)方向里前者更偏寫代碼后者更偏運(yùn)維但都會(huì)用到這期的基礎(chǔ)功。這里我還特別想強(qiáng)調(diào)一個(gè)事情記筆記的方式。建議你從這期開始維護(hù)一個(gè)命令速查筆記把見過的每一條有用的命令和用法記錄下來。不要過分依賴搜索引擎因?yàn)楹芏嘀R(shí)你查過一遍后過段時(shí)間還是會(huì)忘但自己整理過的東西記憶會(huì)深刻許多。這個(gè)筆記不用很正式隨手記即可關(guān)鍵是堅(jiān)持。6.3 保持節(jié)奏比天分重要我接觸過的很多學(xué)習(xí)者在前期都會(huì)有這樣的體驗(yàn)第一周熱情高漲第二周開始被細(xì)節(jié)絆住第三周遇到一個(gè)卡住一晚上的問題就想放棄。這太正常了。Linux 和 Python 的知識(shí)體系是典型的面太廣、上限太高但入門門檻其實(shí)并沒有想象中那么高。你不需要一天內(nèi)掌握所有命令也不必對(duì)著復(fù)雜的權(quán)限模型死磕。把前面提到的核心流程走一遍每天積累一點(diǎn)點(diǎn)手感之后的進(jìn)階會(huì)是水到渠成的事情。這一期的內(nèi)容到這里就結(jié)束了。我的個(gè)人建議是先把環(huán)境搭起來把今天的腳本敲完然后嘗試著自己改一改——比如讓重命名腳本支持多個(gè)目錄或者把統(tǒng)計(jì)腳本的輸出排序。自己動(dòng)手寫過一遍和看別人寫過一遍學(xué)到的深度完全不一樣。