Python 的 random 模組提供 choice 函式方便地從列表中隨機選取元素,搭配 copy 模組可避免重複選取。urllib.request 模組則能讀取網頁內容,將其解碼成 UTF-8 格式。利用 sys.argv 可處理命令列引數,方便程式與使用者互動。ossubprocess 模組能執行 Linux 系統命令,smtplib 模組則提供郵件傳送功能。Bottle 框架可以快速建立 Python 網頁伺服器,處理網頁請求與路由。最後,threading 模組讓 Python 程式能執行多執行緒,提升程式效率,但也需注意執行緒同步和安全問題。

使用 Python 的 random 模組進行隨機選擇

在進行隨機選擇時,常常需要從一個列表中選擇一個元素。Python 的 random 模組提供了一個方便的方法來實作這一功能。下面是一個簡單的範例:

import random

# 定義一個列表
my_list = ['a', 'b', 'c']

# 使用 random.choice() 進行隨機選擇
print(random.choice(my_list))

每次執行這段程式碼,都會從 my_list 中隨機選擇一個元素。

防止重複選擇

在某些情況下,可能需要防止重複選擇。為了實作這一點,可以建立一個列表的副本,每次選擇後從副本中移除所選擇的元素。以下是示範程式碼:

import random
from copy import copy

# 定義原始列表
original_list = ['a', 'b', 'c']

# 建立列表副本
working_list = copy(original_list)

while len(working_list) > 0:
    # 進行隨機選擇
    selected_item = random.choice(working_list)
    
    # 列印所選擇的元素
    print(selected_item)
    
    # 從列表副本中移除所選擇的元素
    working_list.remove(selected_item)

這段程式碼會列印預出 original_list 中的所有元素,每個元素只會被選擇一次,順序是隨機的。

進一步瞭解

如果您需要更多關於 Python 的 random 模組的資訊,可以參考官方檔案。同時,瞭解如何使用 Python 進行網路請求也是非常重要的,這將在下一節中進行介紹。

使用Python讀取網頁內容

Python有一個名為urllib.request的函式庫,可以用來讀取網頁內容。以下是如何使用它來讀取Google首頁內容的範例:

import urllib.request

url = "https://www.google.com"
response = urllib.request.urlopen(url)
contents = response.read().decode("utf-8")

print(contents)

這個範例首先匯入urllib.request函式庫,然後定義要讀取的網頁URL。接下來,它使用urlopen()函式開啟網頁連結,然後使用read()函式讀取網頁內容。最後,它使用decode()函式將內容解碼為UTF-8格式,並將其存入contents變數中。

處理命令列引數

如果你想要在命令列中執行Python程式並傳遞引數,你可以使用sys函式庫的argv變數。以下是如何使用它的範例:

import sys

for i, value in enumerate(sys.argv):
    print(f"arg: {i} {value}")

這個範例首先匯入sys函式庫,然後使用enumerate()函式遍歷argv變數中的引數。每個引數都會被印出來,包括程式名稱和引數值。

例如,如果你在命令列中執行以下命令:

$ python3 ch_07_cmdline.py a b c

輸出將會是:

arg: 0 ch_07_cmdline.py
arg: 1 a
arg: 2 b
arg: 3 c

注意:argv變數中的第一個元素是程式名稱,之後的元素是引數值。

執行 Linux 命令與傳送郵件

執行 Linux 命令

在 Python 中,執行 Linux 命令可以使用 os 模組的 system 函式。這個函式可以執行任意 Linux 命令,並傳回命令的離開狀態。

import os

# 刪除檔案
os.system("rm myfile.txt")

然而,使用 os.system 函式有一個缺點,就是它不能捕捉命令的輸出。為了捕捉命令的輸出,可以使用 subprocess 模組的 check_output 函式。

import subprocess

# 執行 hostname 命令並捕捉輸出
ip = subprocess.check_output(['hostname', '-I'])

傳送郵件

Python 有一個名為 smtplib 的模組,可以用來傳送郵件。這個模組提供了一個簡單的方式來與 SMTP 伺服器溝通,並傳送郵件。

import smtplib

# 設定 SMTP 伺服器
server = smtplib.SMTP('smtp.gmail.com', 587)

# 登入 SMTP 伺服器
server.starttls()
server.login('your_email@gmail.com', 'your_password')

# 傳送郵件
server.sendmail('your_email@gmail.com', 'recipient_email@gmail.com', 'Hello, this is a test email.')

# 關閉 SMTP 伺服器
server.quit()

圖表翻譯:

  flowchart TD
    A[開始] --> B[設定 SMTP 伺服器]
    B --> C[登入 SMTP 伺服器]
    C --> D[傳送郵件]
    D --> E[關閉 SMTP 伺服器]

內容解密:

以上程式碼展示瞭如何使用 Python 的 ossubprocess 模組來執行 Linux 命令,以及如何使用 smtplib 模組來傳送郵件。這些功能可以用於各種應用,例如自動化任務、監控系統等。

使用Python傳送電子郵件

要傳送電子郵件,我們需要使用smtplib函式庫,它是Python的內建函式庫。以下是一個簡單的示例,展示如何使用Python傳送電子郵件。

電子郵件傳送程式碼

import smtplib

# 定義電子郵件伺服器和埠
SMTP_SERVER = 'smtp.gmail.com'
SMTP_PORT = 587

# 定義發件人和收件人
GMAIL_USER = 'your_email@gmail.com'
GMAIL_PASS = 'your_password'
RECIPIENT = 'destination_email_address'

# 定義電子郵件主題和內容
SUBJECT = '測試電子郵件'
TEXT = '這是一封測試電子郵件'

def send_email(recipient, subject, text):
    # 建立SMTP伺服器物件
    smtpserver = smtplib.SMTP(SMTP_SERVER, SMTP_PORT)
    
    # 啟用TLS加密
    smtpserver.ehlo()
    smtpserver.starttls()
    smtpserver.ehlo()
    
    # 登入電子郵件賬戶
    smtpserver.login(GMAIL_USER, GMAIL_PASS)
    
    # 建立電子郵件頭部
    header = 'To:' + recipient + '\n' + 'From: ' + GMAIL_USER
    header = header + '\n' + 'Subject:' + subject + '\n'
    
    # 建立電子郵件內容
    msg = header + '\n' + text + ' \n\n'
    
    # 傳送電子郵件
    smtpserver.sendmail(GMAIL_USER, recipient, msg)
    
    # 關閉SMTP伺服器連線
    smtpserver.close()

# 傳送電子郵件
send_email(RECIPIENT, SUBJECT, TEXT)

解釋

  • 我們首先匯入smtplib函式庫,然後定義電子郵件伺服器、埠、發件人、收件人、主題和內容。
  • send_email函式建立一個SMTP伺服器物件,啟用TLS加密,登入電子郵件賬戶,建立電子郵件頭部和內容,然後傳送電子郵件。
  • 最後,我們呼叫send_email函式傳送一封測試電子郵件。

注意

  • 在使用此程式碼之前,請將GMAIL_USERGMAIL_PASS變數替換為您的實際電子郵件賬戶和密碼。
  • 如果您不是使用Gmail,請更改SMTP_SERVERSMTP_PORT變數以匹配您的電子郵件服務提供商的設定。
  • 此外,請將RECIPIENT變數替換為您要傳送電子郵件的地址。

圖表翻譯:

  flowchart TD
    A[開始] --> B[匯入smtplib函式庫]
    B --> C[定義電子郵件伺服器和埠]
    C --> D[定義發件人和收件人]
    D --> E[定義電子郵件主題和內容]
    E --> F[建立send_email函式]
    F --> G[傳送電子郵件]
    G --> H[關閉SMTP伺服器連線]

圖表解釋:

此Mermaid圖表展示了傳送電子郵件的步驟,從匯入smtplib函式庫開始,到定義電子郵件伺服器、發件人、收件人、主題和內容,最後建立send_email函式併發送電子郵件。

使用Python的Bottle函式庫建立純Python網頁伺服器

要建立一個純Python網頁伺服器,需要使用Bottle函式庫。首先,安裝Bottle函式庫:

$ sudo apt-get install python-bottle

接下來,建立一個Python程式(ch_07_bottle_test.py)來提供網頁服務:

from bottle import route, run, template
from datetime import datetime

@route('/')
def index(name='time'):
    dt = datetime.now()
    time = "{:%Y-%m-%d %H:%M:%S}".format(dt)
    return template('<b>Pi thinks the date/time is: {{t}}</b>', t=time)

run(host='0.0.0.0', port=80)

這個程式使用Bottle函式庫的@route裝飾器來定義網頁路由,當使用者存取根目錄(/)時,會呼叫index函式。這個函式會取得當前的日期和時間,並使用範本引擎將其顯示在網頁上。

要啟動網頁伺服器,需要以超級使用者許可權執行程式:

$ sudo python bottle_test.py

啟動後,可以使用網頁瀏覽器存取Raspberry Pi的IP地址來檢視網頁。

討論

Bottle函式庫非常適合小型、簡單的網頁伺服器專案,因為它是用Python寫成的,因此可以輕鬆地控制硬體。Raspberry Pi(特別是Raspberry Pi 4)可以執行完整的網頁伺服器堆積疊(網頁伺服器、網頁框架和資料函式庫),例如Apache、PHP和MySQL。

參考資料

  • 如何設定Raspberry Pi為LAMP(Linux、Apache、MySQL和PHP)伺服器:[連結]
  • Bottle檔案:[連結]
  • Python日期和時間格式化:[連結]
  • 網際網路相關食譜:[連結]

在Python中暫停執行

問題

您想要Python暫停執行一段時間。例如,您可能想要在傳送訊息到終端機之間建立延遲。

解決方案

使用time函式庫中的sleep函式,如下所示:

import time

time.sleep(5)  # 暫停5秒

這個程式會暫停5秒鐘後繼續執行。

討論

sleep函式可以用來建立延遲或暫停執行緒。它可以用於各種情況,例如在傳送訊息到終端機之間建立延遲,或是在等待某個事件發生時暫停執行緒。

多執行緒程式設計

在 Python 中,當一個程式正在執行某個任務時,可能需要同時執行另一個任務。這種情況下,可以使用多執行緒(Multithreading)技術來實作。

基本概念

多執行緒是指在一個程式中,同時存在多個執行緒(Thread),每個執行緒都可以執行不同的任務。這樣可以提高程式的效率和回應速度。

實作多執行緒

Python 提供了 threading 模組來實作多執行緒。以下是基本的使用方法:

import threading
import time
import random

def annoy(message):
    while True:
        time.sleep(random.randint(1, 3))
        print(message)

t = threading.Thread(target=annoy, args=('BOO!!',))
t.start()

在這個例子中,定義了一個函式 annoy,它會不斷地列印一條訊息。然後,建立了一個執行緒 t,它的目標是 annoy 函式,引數是 ('BOO!!',)。最後,啟動了執行緒 t

內容解密:

  • threading.Thread 類別用於建立一個新的執行緒。
  • target 引數指定了執行緒要執行的函式。
  • args 引數指定了傳遞給目標函式的引數。
  • start() 方法用於啟動執行緒。

多執行緒的優點

多執行緒可以提高程式的效率和回應速度。因為多個執行緒可以同時執行,所以可以更快地完成多個任務。

多執行緒的挑戰

多執行緒也帶來了一些挑戰,例如:

  • 執行緒同步:當多個執行緒存取分享資源時,需要同步機制來避免衝突。
  • 執行緒安全:需要確保多個執行緒之間的通訊是安全的。

圖表翻譯:

  flowchart TD
    A[主執行緒] --> B[建立執行緒]
    B --> C[啟動執行緒]
    C --> D[執行任務]
    D --> E[完成任務]
    E --> F[傳回主執行緒]

圖表翻譯:

上述流程圖描述了多執行緒的基本流程。主執行緒建立了一個新的執行緒,然後啟動它。新的執行緒執行自己的任務,完成後傳回主執行緒。

從技術架構視角來看,Python 的 randomurllib.requestossubprocesssmtplibbottletime 以及 threading 等模組,提供豐富的功能,涵蓋了隨機數生成、網路請求、系統操作、郵件傳送、Web 服務搭建、時間控制及多執行緒程式設計等方面。透過這些模組的整合,開發者可以快速構建功能完善的應用程式。然而,深入剖析這些模組的底層機制及限制,才能真正發揮其效能。例如,os.system 執行外部命令的安全性及效率問題,smtplib 傳送郵件的安全性設定,以及多執行緒程式設計中,鎖機制的使用與效能的平衡等,都是需要仔細考量的關鍵。對於追求高效能的應用,更需深入研究各模組的最佳實踐,例如使用 subprocess 模組取代 os.system,使用更安全的郵件傳送函式庫,以及採用非同步程式設計模型提升多執行緒效能。展望未來,隨著 Python 生態的持續發展,預計會有更多高效能且安全的模組出現,進一步簡化開發流程。對於開發者而言,持續學習並掌握新的技術和工具,才能保持競爭力。玄貓認為,深入理解這些模組的底層原理,並結合實際應用場景進行最佳化,才能真正將 Python 的強大功能發揮到極致。