在 Linux 環境下進行 Python 開發,熟悉 Pip 和命令列工具至關重要。本文將會逐步說明如何使用 Pip 安裝 Python 套件,以及使用 wget 和 Git 下載檔案與程式碼。此外,我們也會探討 Git 與 GitHub 的差異、GitHub 的優勢,以及如何設定程式在系統啟動時自動執行,與 crontab 指令的排程使用與 find 指令的檔案搜尋教學。
使用 Pip 安裝 Python 套件相當簡單,在 Raspberry Pi 等系統中,Pip 通常已預先安裝。直接在終端機輸入 sudo pip install 套件名稱
即可安裝所需的套件,例如 sudo pip install svgwrite
。如果系統尚未安裝 Pip,則可使用 sudo apt-get install python-pip
指令安裝。雖然有些 Python 函式庫可以使用 apt-get 安裝,但並非所有套件都適用,此時 Pip 就顯得格外重要。
若需從網路下載檔案,wget 指令提供一個便捷的方案,無需開啟瀏覽器即可下載。例如,使用 wget http://example.com/Pifm.tar.gz
即可下載指設定檔案。建議將 URL 用雙引號包起來,尤其當 URL 包含特殊字元時。
Git 是一個版本控制系統,而 GitHub 則是一個根據 Git 的程式碼託管平臺。Git 允許追蹤程式碼的修改歷史,而 GitHub 則提供了程式碼儲存、版本控制、協作開發等功能。使用 GitHub 可以將程式碼儲存在雲端,方便團隊協作,並能追蹤程式碼版本、進行程式碼審查等。
要在系統啟動時自動執行程式,可以使用 systemd 或 rc.local。使用 systemd,需在 /etc/systemd/system
目錄下建立服務檔案,設定執行程式、使用者、啟動條件等,並使用 systemctl 指令啟用和啟動服務。使用 rc.local 則需編輯 /etc/rc.local
檔案,加入執行程式的指令,並在指令後加上 &
讓程式在背景執行。
使用 crontab 可以設定程式在特定時間自動執行。編輯 crontab 檔案,設定分鐘、小時、日期、月份、星期幾以及要執行的指令,即可排程任務。
使用 find 指令可以在系統中搜尋特設定檔案。輸入 find 起始目錄 -name 檔名
即可搜尋指設定檔案,例如 find /home/pi -name gemgem.py
。可以使用萬用字元來搜尋符合特定模式的檔案,例如 find /home/pi -name 'match*'
。
使用Pip安裝Python套件
問題 您想要使用Pip(Pip Installs Packages)套件管理器來安裝Python函式庫。
解決方案 如果您具有最新版本的Raspbian,Pip將已經安裝,您可以從命令列執行它,如下面的範例所示,這個範例來自食譜8.1,其中它用於安裝Python函式庫svgwrite:
sudo pip install svgwrite
如果Pip未在您的系統上安裝,您可以使用以下命令安裝它:
sudo apt-get install python-pip
討論 雖然許多Python函式庫可以使用apt-get安裝(請參考食譜3.17),但有些不能,您必須使用Pip代替。
另請參考 要使用apt-get安裝軟體,請參考食譜3.17。
從命令列下載檔案
問題 您想要在不使用網頁瀏覽器的情況下從網際網路下載檔案。
解決方案 您可以使用wget命令從網際網路下載檔案。 例如,以下命令從網際網路下載檔案Pifm.tar.gz:
wget http://example.com/Pifm.tar.gz
如果您的URL包含任何特殊字元,封裝它們在雙引號中是一個好主意。這個範例URL來自食譜4.6。
內容解密:
上述命令使用wget從指定的URL下載檔案。wget命令是下載檔案的一種方便方式,尤其是在不需要使用網頁瀏覽器的情況下。
圖表翻譯:
flowchart TD A[開始] --> B[輸入wget命令] B --> C[下載檔案] C --> D[儲存檔案] D --> E[完成]
圖表翻譯:
此流程圖顯示了使用wget下載檔案的步驟。首先,輸入wget命令,然後下載檔案,接著儲存檔案,最後完成下載過程。
使用wget和Git下載軟體及原始碼
在進行軟體開發或安裝時,經常需要下載檔案或原始碼。這篇文章將介紹如何使用wget和Git下載軟體及原始碼。
使用wget下載檔案
wget是一個強大的下載工具,可以用於下載檔案或網頁。它的使用方法很簡單,只需要在命令列中輸入wget後面加上要下載的檔案URL即可。例如:
wget https://example.com/file.zip
這將下載檔案file.zip到當前目錄中。
使用Git下載原始碼
Git是一個版本控制系統,常用於開發軟體。要下載Git儲存函式庫中的原始碼,可以使用git clone命令。例如:
git clone https://github.com/user/repository.git
這將下載repository.git倉函式庫中的所有原始碼到一個新的目錄中。
Git和GitHub的區別
Git是一個版本控制系統,而GitHub是一個根據Git的網站,提供了程式碼儲存和版本控制的功能。使用GitHub可以將程式碼儲存在雲端,方便其他人檢視和使用。此外,GitHub還提供了許多其他功能,例如程式碼審查、問題追蹤等。
使用GitHub的優點
使用GitHub有許多優點,包括:
- 程式碼儲存在雲端,方便其他人檢視和使用
- 可以追蹤程式碼的變化和版本
- 可以與其他人合作開發軟體
- 可以發布軟體並讓其他人下載
建立GitHub倉函式庫
要建立一個GitHub倉函式庫,可以按照以下步驟進行:
- 登入GitHub帳戶
- 點選右上角的+按鈕,選擇新建倉函式庫
- 輸入倉函式庫名稱和描述
- 選擇初始化倉函式庫以README檔案
- 選擇授權協定
- 點選建立倉函式庫
圖表翻譯:
graph LR A[登入GitHub帳戶] --> B[點選右上角的+按鈕] B --> C[選擇新建倉函式庫] C --> D[輸入倉函式庫名稱和描述] D --> E[選擇初始化倉函式庫以README檔案] E --> F[選擇授權協定] F --> G[點選建立倉函式庫]
內容解密:
以上步驟是建立GitHub倉函式庫的過程。首先需要登入GitHub帳戶,然後點選右上角的+按鈕,選擇新建倉函式庫。接下來需要輸入倉函式庫名稱和描述,然後選擇初始化倉函式庫以README檔案。最後需要選擇授權協定並點選建立倉函式庫。
圖表翻譯:
graph LR A[使用wget下載檔案] --> B[使用Git下載原始碼] B --> C[Git和GitHub的區別] C --> D[使用GitHub的優點] D --> E[建立GitHub倉函式庫]
內容解密:
以上圖表展示了使用wget下載檔案、使用Git下載原始碼、Git和GitHub的區別、使用GitHub的優點以及建立GitHub倉函式庫的過程。這些步驟可以幫助開發者更好地使用Git和GitHub進行軟體開發。
自動在啟動時執行程式或指令碼
問題描述
您想要在 Raspberry Pi 啟動時自動執行某個程式或指令碼。
解決方案
為了實作自動在啟動時執行程式或靦本,您可以使用 systemd 服務或 rc.local 指令碼。以下將介紹這兩種方法:
方法一:使用 systemd 服務
- 建立服務檔案:在
/etc/systemd/system
目錄下建立一個新的服務檔案,例如myprogram.service
。 - 編寫服務檔案內容:在檔案中加入以下內容:
[Unit]
Description=My Program
After=network.target
[Service]
User=pi
ExecStart=/usr/bin/python /home/pi/myprogram.py
Restart=always
[Install]
WantedBy=multi-user.target
- 重新載入 systemd 組態:執行
sudo systemctl daemon-reload
重新載入 systemd 組態。 - 啟用服務:執行
sudo systemctl enable myprogram
啟用服務。 - 啟動服務:執行
sudo systemctl start myprogram
啟動服務。
方法二:使用 rc.local 指令碼
- 編輯 rc.local 指令碼:執行
sudo nano /etc/rc.local
編輯 rc.local 指令碼。 - 加入執行命令:在檔案中加入以下內容:
/usr/bin/python /home/pi/myprogram.py &
- 儲存並離開:儲存並離開編輯器。
- 重新啟動系統:重新啟動系統以測試是否成功自動執行程式或靦本。
討論
這兩種方法都可以實作自動在啟動時執行程式或靦本,但 systemd 服務提供了更好的管理和控制功能。您可以根據自己的需求選擇適合的方法。
相關資源
- Recipe 3.21: 學習更多關於 Git 和 GitHub 的資訊。
- Recipe 3.22: 下載本文的程式碼和其他相關檔案。
圖表翻譯:
flowchart TD A[建立服務檔案] --> B[編寫服務檔案內容] B --> C[重新載入 systemd 組態] C --> D[啟用服務] D --> E[啟動服務] E --> F[自動執行程式或靦本]
內容解密:
上述步驟描述瞭如何使用 systemd 服務或 rc.local 指令碼實作自動在啟動時執行程式或靦本。透過這些步驟,您可以讓您的 Raspberry Pi 在啟動時自動執行您指定的程式或靦本。
自動執行程式或指令碼
問題
您想要在 Raspberry Pi 啟動時自動執行一個程式或指令碼。
解決方案
修改 /etc/rc.local
檔案以執行您想要的程式。
使用 sudo nano /etc/rc.local
命令編輯 /etc/rc.local
檔案,然後在檔案中新增以下行:
/usr/bin/python /home/pi/my_program.py &
注意:在命令列末尾新增 &
符號,以便程式在背景中執行,否則 Raspberry Pi 將無法啟動。
討論
這種方法需要小心編輯 rc.local
檔案,否則可能會導致 Raspberry Pi 無法啟動。
參考
另有一種更安全的方法是使用服務(Service)來自動執行程式,詳見 Recipe 3.24。
作為服務自動執行程式或指令碼
問題
您想要安排一個指令碼或程式在每次 Raspberry Pi 重新啟動時自動執行。
解決方案
Debian Linux(大多數 Raspberry Pi 發行版的基礎)使用了一種依賴性機制來自動執行命令。這需要建立一個組態檔案,該檔案將存放在 init.d
目錄中。
討論
以下示例顯示如何執行一個 Python 指令碼,該指令碼位於您的家目錄中。該指令碼可以執行任何任務,但在此示例中,它執行了一個簡單的 Python 網頁伺服器(詳見 Recipe 7.17)。
以下是步驟:
- 建立一個初始化指令碼。
- 將初始化指令碼設為可執行。
- 告知系統關於新的初始化指令碼。
首先,建立初始化指令碼。您需要在 /etc/init.d/
目錄中建立此指令碼。該指令碼可以命名為任何名稱,但在此示例中,我們將其命名為 my_server
。使用以下命令建立新檔案:
sudo nano /etc/init.d/my_server
然後,將以下內容新增到檔案中:
#!/bin/sh
# /etc/init.d/my_server
# Starts the my_server script
case "$1" in
start)
/usr/bin/python /home/pi/my_server.py &
;;
stop)
# Add code here to stop your script
;;
*)
echo "Usage: $0 {start|stop}"
exit 1
;;
esac
接下來,將初始化指令碼設為可執行:
sudo chmod +x /etc/init.d/my_server
最後,告知系統關於新的初始化指令碼:
sudo update-rc.d my_server defaults
現在,您的指令碼將在每次 Raspberry Pi 重新啟動時自動執行。
建立系統啟動指令碼
為了確保您的簡單網頁伺服器在系統啟動時自動啟動,需要建立一個系統啟動指令碼。這個指令碼將被放在 /etc/init.d/
目錄下,並需要設定正確的許可權以便系統可以執行它。
步驟 1:建立指令碼檔案
首先,使用 sudo
許可權開啟檔案編輯器,例如 nano
,並建立一個名為 my_server
的新檔案:
sudo nano /etc/init.d/my_server
在編輯器中,貼上以下程式碼:
### BEGIN INIT INFO
# Provides: my_server
# Required-Start: $remote_fs $syslog $network
# Required-Stop: $remote_fs $syslog $network
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: 簡單網頁伺服器
# Description: 簡單網頁伺服器
### END INIT INFO
#! /bin/sh
# /etc/init.d/my_server
export HOME
case "$1" in
start)
echo "啟動我的伺服器"
sudo /usr/bin/python /home/pi/myserver.py 2>&1 &
;;
步驟 2:儲存並設定許可權
儲存檔案後,需要設定正確的許可權以便系統可以執行這個指令碼。使用以下命令設定許可權:
sudo chmod +x /etc/init.d/my_server
步驟 3:更新系統啟動連結
最後,需要更新系統啟動連結以便在系統啟動時自動執行這個指令碼。使用以下命令更新連結:
sudo update-rc.d my_server defaults
這樣就完成了簡單網頁伺服器的系統啟動指令碼設定。重新啟動系統後,您的網頁伺服器應該會自動啟動。
內容解密:
上述程式碼是一個簡單的系統啟動指令碼,使用 case
陳述式來處理不同的命令引數。在這個例子中,只定義了 start
命令,當系統啟動時會執行這個命令。指令碼會輸出一條訊息並在背景執行 Python 指令碼 /home/pi/myserver.py
。注意,2>&1 &
是用來將標準錯誤輸出重定向到標準輸出,並在背景執行命令。
圖表翻譯:
flowchart TD A[系統啟動] --> B[執行 my_server 指令碼] B --> C[輸出訊息] C --> D[在背景執行 Python 指令碼] D --> E[完成]
這個流程圖描述了系統啟動時的過程,從執行 my_server
指令碼開始,到在背景執行 Python 指令碼為止。
自動化指令碼服務設定
為了讓您的Python指令碼在系統啟動時自動執行,需要進行一些設定。以下是步驟:
步驟1:建立服務指令碼
首先,需要建立一個服務指令碼,該指令碼將用於控制您的Python指令碼的啟動和停止。以下是一個基本的範例:
#!/bin/bash
case "$1" in
start)
echo "啟動My Server"
python /path/to/myserver.py &
;;
stop)
echo "停止My Server"
PID=$(ps auxwww | grep myserver.py | head -1 | awk '{print $2}')
kill -9 $PID
;;
*)
echo "Usage: /etc/init.d/my_server {start|stop}"
exit 1
;;
esac
exit 0
請注意,您需要將 /path/to/myserver.py
替換為您的Python指令碼的實際路徑。
步驟2:設定服務指令碼許可權
為了讓服務指令碼可以執行,需要設定其許可權:
sudo chmod +x /etc/init.d/my_server
步驟3:測試服務
在設定服務啟動之前,需要測試服務是否正常工作:
/etc/init.d/my_server start
如果一切正常,您應該會看到類別似於以下的輸出:
啟動My Server
Bottle v0.11.4 server starting up (using WSGIRefServer())...
Hit Ctrl-C to quit.
步驟4:設定服務啟動
如果服務測試正常,則可以設定服務啟動:
sudo update-rc.d my_server defaults
這將使得您的服務在系統啟動時自動執行。
自動化指令碼執行
在 Linux 系統中,若要讓程式或指令碼在固定的時間間隔內自動執行,可以使用 crontab
命令。這個命令允許您排程事件在特定的時間或間隔執行,例如每天或每小時。
使用 crontab
命令
首先,您需要確保您的 Raspberry Pi 知道目前的時間和日期,因此需要有一個網路連線或是一個實時鐘(RTC),詳見 Recipe 12.13。
您可以使用以下命令編輯排程事件:
$ crontab -e
如果您要執行的指令碼或程式需要以特定的使用者身份(如 root
)執行,您可以在 crontab
命令前加上 sudo
,詳見 Recipe 3.12。
編輯 crontab
內容
在 crontab
檔案中,每一行代表一個排程任務。格式如下:
minute hour day month day_of_week command
minute
: 分鐘(0-59)hour
: 小時(0-23)day
: 月份中的日子(1-31)month
: 月份(1-12)day_of_week
: 星期(0-6),其中 0 代表星期日command
: 要執行的命令或指令碼
如果您在某個欄位中使用 *
,代表該欄位為「每」;如果您填入一個數字,則代表只在那個特定時間執行。
例如,要在每天凌晨 1 點執行一個指令碼,您可以新增以下行:
0 1 * * * /home/pi/myscript.sh
如果您只想要在星期一到星期五凌晨 1 點執行指令碼,可以這樣寫:
0 1 * * 1-5 /home/pi/myscript.sh
如果您的指令碼需要在特定的目錄下執行,您可以使用分號 (;
) 分隔多個命令,例如:
0 1 * * * cd /home/pi; python mypythoncode.py
查閱 crontab
檔案
您可以使用以下命令查閱 crontab
的手冊頁:
$ man crontab
這將提供您更多關於如何使用 crontab
的資訊。
如何在 Linux 系統中找到特設定檔案
當您知道某個檔案存在於系統中,但不知道其確切位置時,可以使用 Linux 的 find
命令來搜尋。
解決方案
使用 find
命令來搜尋檔案。這個命令可以從指定的目錄開始搜尋,並顯示找到的檔案位置。
範例
假設您想要在 /home/pi
目錄下搜尋名為 gemgem.py
的檔案,可以使用以下命令:
find /home/pi -name gemgem.py
如果檔案存在,命令會顯示其位置,例如:
/home/pi/python_games/gemgem.py
您也可以從根目錄 (/
) 開始搜尋整個檔案系統,但這可能需要更長時間,並可能產生錯誤訊息。您可以將這些錯誤訊息重導到 /dev/null
以避免幹擾結果:
find / -name gemgem.py 2>/dev/null
使用萬用字元
find
命令也支援使用萬用字元。例如,若要搜尋所有以 match
開頭的檔案,可以使用以下命令:
find /home/pi -name 'match*'
這將顯示所有符合條件的檔案位置,例如:
/home/pi/python_games/match4.wav
/home/pi/python_games/match2.wav
/home/pi/python_games/match1.wav
/home/pi/python_games/match3.wav
/home/pi/python_games/match0.wav
/home/pi/python_games/match5.wav
進一步瞭解
find
命令具有更多高階功能,允許您根據不同的條件進行搜尋。若要檢視 find
命令的完整手冊頁檔案,可以使用以下命令:
man find
這將提供您有關 find
命令的所有可用選項和用法的詳細資訊。
命令列歷史的使用
結論:自動化任務與系統管理技巧
綜觀 Raspberry Pi 系統管理的實務操作,自動化任務執行和高效的系統管理至關重要。從本文探討的 pip 套件安裝、檔案下載、程式自動執行、系統服務設定到檔案搜尋,每個環節都體現了提升效率的核心思想。分析 systemd 和 rc.local 等不同自動化啟動方案的優劣,可以發現 systemd 更具彈性與控制力,適合複雜的系統服務管理。然而,rc.local 的簡潔性在處理簡單任務時仍有其優勢。技術的發展趨勢也指向更精細化的系統管理工具,例如使用 crontab 進行更複雜的定時任務排程。對於 Raspberry Pi 使用者而言,掌握這些技巧不僅能提升開發效率,更能深入理解 Linux 系統的運作機制。玄貓認為,隨著物聯網和邊緣計算的興起,精通這些自動化和系統管理技術將成為開發者不可或缺的核心競爭力。