Python 開發中,妥善管理專案依賴和建立虛擬環境至關重要,能有效避免版本衝突和環境汙染。本文將示範如何使用 pip 和 virtualenv 建立和管理虛擬環境,確保專案在乾淨隔離的環境中執行。同時,我們會介紹如何使用 argparse 和 OptionParser 解析命令列引數,並透過類別封裝全域性引數,提升程式碼結構和可讀性。此外,文章也將示範如何在 PyCharm 和 IDLE 等開發環境中進行程式碼除錯,以及如何利用 sys 和 os 模組與作業系統互動,執行檔案操作和取得系統資訊。這些技巧能幫助開發者更有效率地管理 Python 專案,提升程式碼品質和可維護性。
管理Python專案中的依賴與虛擬環境
在Python開發中,管理專案依賴和建立虛擬環境是至關重要的步驟。本篇文章將介紹如何使用pip和virtualenv來管理依賴和建立虛擬環境。
使用argparse管理命令列引數
在Python指令碼中,我們經常需要處理命令列引數。argparse模組提供了一個簡單而強大的方式來管理這些引數。
import argparse
parser = argparse.ArgumentParser(description='傳遞引數範例')
parser.add_argument("-p1", dest="param1", help="引數1")
parser.add_argument("-p2", dest="param2", help="引數2")
params = parser.parse_args()
print("引數1:", params.param1)
print("引數2:", params.param2)
內容解密:
argparse.ArgumentParser用於建立一個解析器物件。add_argument方法用於新增命令列引數。parse_args方法用於解析命令列引數。
使用類別封裝全域性引數
為了提高程式碼的可讀性,我們可以建立一個類別來封裝全域性引數。
import argparse
class Parameters:
"""全域性引數"""
def __init__(self, **kwargs):
self.param1 = kwargs.get("param1")
self.param2 = kwargs.get("param2")
def view_parameters(input_parameters):
print(input_parameters.param1)
print(input_parameters.param2)
parser = argparse.ArgumentParser(description='傳遞引數物件範例')
parser.add_argument("-p1", dest="param1", help="引數1")
parser.add_argument("-p2", dest="param2", help="引數2")
params = parser.parse_args()
input_parameters = Parameters(param1=params.param1, param2=params.param2)
view_parameters(input_parameters)
內容解密:
Parameters類別用於封裝全域性引數。view_parameters函式用於列印引數。
使用OptionParser管理命令列引數
除了argparse,Python還提供了OptionParser類別來管理命令列引數。
from optparse import OptionParser
class Parameters:
"""全域性引數"""
def __init__(self, **kwargs):
self.param1 = kwargs.get("param1")
self.param2 = kwargs.get("param2")
def view_parameters(input_parameters):
print(input_parameters.param1)
print(input_parameters.param2)
parser = OptionParser()
parser.add_option("--p1", dest="param1", help="引數1")
parser.add_option("--p2", dest="param2", help="引數2")
(options, args) = parser.parse_args()
input_parameters = Parameters(param1=options.param1, param2=options.param2)
view_parameters(input_parameters)
內容解密:
OptionParser類別用於建立一個解析器物件。add_option方法用於新增命令列引數。
管理專案依賴
在Python專案中,我們需要管理專案的依賴。我們可以建立一個名為requirements.txt的檔案來記錄專案的依賴。
$ pip install -r requirements.txt
內容解密:
pip是Python的包管理器。requirements.txt檔案記錄了專案的依賴。
生成requirements.txt檔案
我們可以使用pipreqs模組來生成requirements.txt檔案。
$ pipreqs <path_project>
內容解密:
pipreqs模組用於生成requirements.txt檔案。
虛擬環境
虛擬環境提供了一個獨立的環境來安裝Python模組和執行Python程式。
$ python -m venv myenv
內容解密:
venv模組用於建立虛擬環境。
組態虛擬環境
當你安裝一個Python模組時,你可以選擇是否安裝在虛擬環境中。
$ source myenv/bin/activate
內容解密:
source命令用於啟用虛擬環境。
綜上所述,本文介紹瞭如何使用argparse和OptionParser管理命令列引數,如何使用類別封裝全域性引數,以及如何管理專案依賴和建立虛擬環境。這些技術對於Python開發人員來說是非常重要的。
使用Python指令碼開發
建立虛擬環境
virtualenv是一個Python模組,能夠讓你建立隔離的虛擬環境。基本上,你需要建立一個資料夾,包含專案所需的所有可執行檔案和模組。你可以透過以下步驟安裝virtualenv:
- 輸入以下命令:
$ sudo pip install virtualenv
- 建立新的虛擬環境,在新的資料夾中執行以下命令:
$ cd your_new_folder
$ virtualenv name-of-virtual-environment
$ source bin/activate
- 啟用虛擬環境後,你將擁有一個乾淨的模組和函式庫環境,需要下載專案的依賴項,並將它們複製到此目錄中,使用以下命令:
(venv) > pip install -r requirements.txt
執行此命令將在當前工作目錄中建立一個資料夾,包含Python的所有可執行檔案和pip模組,讓你能夠在虛擬環境中安裝不同的套件。
重點提示
如果你使用的是Python 3.3或更高版本,virtualenv已經包含在標準函式庫中。你可以在Python檔案中找到virtualenv的安裝更新資訊:https://docs.python.org/3/library/venv.html。
virtualenv就像一個沙箱,當你在工作時,專案的所有依賴項都會被安裝在其中,並且所有模組和依賴項都被分開。如果使用者在他們的機器上安裝了相同版本的Python,同樣的程式碼將在虛擬環境中工作,無需任何更改。
Python指令碼開發環境
在本文中,我們將介紹PyCharm和Python IDLE作為Python指令碼開發環境。
設定開發環境
為了快速開發和除錯Python應用程式,使用整合開發環境(IDE)是絕對必要的。如果你想嘗試不同的選項,我們建議你檢視Python官方網站上的列表,你可以在那裡看到根據你的作業系統和需求的工具:https://wiki.python.org/moin/IntegratedDevelopmentEnvironments。
在所有的環境中,以下兩個是我們將要介紹的:
- PyCharm:http://www.jetbrains.com/pycharm
- Python IDLE:https://docs.python.org/3/library/idle.html
PyCharm
PyCharm是由Jetbrains開發的IDE,根據該公司的IntelliJ IDEA,同樣是該公司針對Java的IDE,也是Android Studio的基礎。
PyCharm是多平台的,我們可以找到適用於Windows、Linux和macOS X的二進位制檔案。PyCharm有兩個版本:社群版和技術版,在與網頁框架整合和資料函式庫支援方面的功能有所不同。在以下網址中,我們可以看到兩個版本之間的比較:http://www.jetbrains.com/pycharm。
這個開發環境的主要優點如下:
- 自動完成、語法高亮、分析工具和重構
- 與網頁框架(如Django和Flask)的整合
- 先進的除錯器
- 與版本控制系統(如Git、CVS和SVN)的連線
在PyCharm中設定虛擬環境
在以下的截圖中,我們可以看到如何在PyCharm中設定虛擬環境:
此圖示顯示瞭如何設定與建立新環境相關的組態,以使用virtualenv進行專案開發。
使用PyCharm進行除錯
在本例中,我們正在除錯一個接受兩個輸入引數的Python指令碼。一個有趣的話題是能夠在我們的指令碼中新增斷點。
在以下的截圖中,我們正在view_parameters方法中設定斷點:
此圖示顯示瞭如何在PyCharm中設定斷點。
檢視斷點
使用“View Breakpoint”選項,我們可以看到在指令碼中設定的斷點: 此圖示顯示瞭如何在PyCharm中檢視斷點。
除錯變數
在以下的截圖中,我們可以看到包含我們正在除錯的值的引數的值: 此圖示顯示瞭如何在PyCharm中除錯變數。
這樣,我們就可以知道每個變數在執行時的狀態,以及修改它們的值來改變我們的指令碼邏輯。
使用Python IDLE進行除錯
Python IDLE是預設安裝在你的作業系統中的IDE。當執行Python IDLE時,它提供了除錯你的指令碼並在Python shell控制檯中檢視錯誤和異常的功能: 此圖示顯示瞭如何在Python shell中執行指令碼。
在上面的截圖中,我們可以看到Python shell中的輸出,並且異常與“檔案未找到”相關。
重點回顧
以下是一些問題,供您測試對本章材料的瞭解。你可以在附錄的評估部分找到答案:
- Python中的哪種資料結構允許我們將值與鍵相關聯?
- 如何在Python開發環境中除錯變數?
- Python中的哪個類別是所有異常的父類別?
- 哪個方法傳回包含特定模組中所有可用實體名稱的字母排序列表?
- Python從
optparse模組提供了哪個類別用於管理命令列引數?
深入閱讀
在這些連結中,您將找到有關前面提到的工具和我們分析的一些模組的官方Python檔案的更多資訊:
- Python 3.7版本函式庫:https://docs.python.org/3.7/library/
- Virtualenv檔案:https://virtualenv.pypa.io/en/latest/
- Python整合開發環境:https://wiki.python.org/moin/IntegratedDevelopmentEnvironments
系統程式設計套件
在本章中,我們繼續學習與作業系統和檔案系統互動的不同方式。您在本章中獲得的有關不同程式設計套件的知識將證明對自動化某些任務非常有用,這些任務可以提高我們的指令碼效率。
在本章中,我們將介紹Python中用於與Python直譯器、作業系統和執行命令互動的主要模組。我們將介紹如何在讀取和建立檔案時與檔案系統互動。同時,我們還將介紹執行緒管理和用於多執行緒和並發性的其他模組。
我們將在本章結束時介紹socket.io模組,用於實作非同步伺服器。
Python系統程式設計套件
本章節將涵蓋以下主題:
- Python中的系統模組介紹
- 在Python中與檔案系統互動
- 在Python中管理執行緒
- Python中的多執行緒與平行處理
- 使用Python的socket.io模組
技術需求
要充分利用本章,您需要具備一些關於在作業系統中執行命令的基本知識。此外,在開始之前,請在本機上安裝Python發行版。我們將使用可在www.python.org/downloads下載的Python 3.7版本。
Python中的系統模組介紹
Python在其標準函式庫中提供了一些系統模組,我們將重點介紹三個:
os模組sys模組subprocess模組
這些模組允許我們存取諸如瞭解正在執行的Python環境、管理目錄、查詢直譯器資訊以及執行作業系統命令等功能。
系統(sys)模組
sys模組允許我們與直譯器互動,並包含大多數與執行相關的資訊,這些資訊由直譯器更新,以及一系列函式和低階物件。
範例:使用sys.argv取得命令列引數
您可以透過以下程式碼來瞭解sys.argv的使用方法,這段程式碼位於sys_arguments.py檔案中:
import sys
print("這是指令碼的名稱:", sys.argv[0])
print("引數的數量是:", len(sys.argv))
print("引數是:", str(sys.argv))
print("第一個引數是:", sys.argv[1])
print("第二個引數是:", sys.argv[2])
內容解密:
sys.argv是一個包含命令列中所有引數的陣列,第一個索引sys.argv[0]包含指令碼的名稱。- 其餘的
argv列表中的專案包括下一個命令列中的引數。 - 如果我們傳遞三個以上的引數,那麼
sys.argv將包含四個物件。
執行上述指令碼時,可以傳遞一些引數,例如:
$ python3 sys_arguments.py one two three
取得系統變數
您可以使用sys模組中的屬性來取得一些系統變數。以下是一個範例,位於sys_variables.py檔案中:
>>> import sys
>>> sys.platform
'linux'
>>> sys.version
'3.8.2 (default, Feb 26 2020, 02:56:10) \n[GCC 7.4.0]'
>>> sys.getfilesystemencoding()
'utf-8'
>>> sys.getdefaultencoding()
'utf-8'
>>> sys.path
['/opt/virtualenvs/python3/lib/python3.8/site-packages', '/usr/lib/python38.zip', '/usr/lib/python3.8', '/usr/lib/python3.8/lib-dynload']
內容解密:
sys.platform傳回目前的作業系統。sys.version傳回直譯器的版本。sys.getfilesystemencoding()傳回檔案系統使用的編碼。sys.getdefaultencoding()傳回預設編碼。sys.path傳回直譯器在執行import指令時搜尋模組的所有目錄列表。
作業系統(os)模組
os模組是存取作業系統不同功能的最佳機制。使用此模組將取決於所使用的作業系統。例如,在Windows和Linux上建立檔案的命令不同,因為檔案系統不同。
範例:檢查檔案是否存在
以下程式碼位於check_filename.py檔案中,用於檢查以命令列引數傳遞的文字檔名稱是否存在於目前執行路徑中,以及目前使用者是否具有對該檔案的讀取許可權:
import sys
import os
if len(sys.argv) == 2:
filename = sys.argv[1]
print(filename)
if os.path.isfile(filename):
print('[+] ' + filename + ' 存在。')
exit(0)
if not os.path.isfile(filename):
print('[+] ' + filename + ' 不存在。')
exit(0)
if not os.access(filename, os.R_OK):
print('[+] ' + filename + ' 存取被拒絕。')
exit(0)
內容解密:
- 使用
os.path.isfile()方法檢查檔案是否存在。 - 使用
os.access()方法檢查目前使用者是否具有對檔案的讀取許可權。
執行上述指令碼時,需要傳遞要檢查是否存在的檔案作為引數。
列出目前工作目錄的內容
您可以使用os模組中的os.getcwd()和os.listdir()方法來列出目前工作目錄的內容。以下是一個範例,位於show_content_directory.py檔案中:
import os
pwd = os.getcwd()
list_directory = os.listdir(pwd)
for directory in list_directory:
print('[+] ', directory)
內容解密:
- 使用
os.getcwd()方法檢索目前工作目錄路徑,並將該值儲存在pwd變數中。 - 使用
os.listdir()方法取得目前工作目錄中的檔名和目錄。 - 對列表目錄進行迭代,以取得檔案和目錄。