Python 生態系提供了多樣的專案管理和互動式開發工具,有效提升開發效率。Poetry 和 Pipenv 簡化了依賴管理和虛擬環境設定,而 DevPI 則提供了私有套件儲存函式庫的解決方案。在互動式開發方面,原生控制檯、增強型 REPL 工具如 ptpython 和 IPython,以及功能豐富的 Jupyter 環境,都為開發者提供了強大的探索性程式設計和除錯能力。理解這些工具的特性和應用場景,能幫助開發者選擇最適合的工具,提升開發效率。
Poetry 與 Pipenv:Python 專案管理的兩大利器
在 Python 開發領域,專案管理是一項至關重要的任務。Poetry 和 Pipenv 是兩款流行的工具,分別提供了不同的功能來簡化專案管理流程。本文將探討 Poetry 的基本使用、專案結構、依賴管理,以及與 Pipenv 的比較。
Poetry 的基本使用
Poetry 是一款用於 Python 專案管理的工具,它提供了建立、管理和釋出 Python 套件的功能。使用 Poetry 建立新專案非常簡單,只需執行 poetry new <專案名稱> 即可。
$ poetry new simple_app
建立專案後,Poetry 會生成一個基本的目錄結構,包括 pyproject.toml、README.rst、simple_app/__init__.py 等檔案。其中,pyproject.toml 是 Poetry 的核心設定檔,包含了專案的元資料、依賴關係等資訊。
pyproject.toml 檔案結構
pyproject.toml 檔案包含了專案的元資料和依賴關係。以下是一個基本的範例:
[build-system]
requires = ["poetry-core>=1.0.0"]
build-backend = "poetry.core.masonry.api"
[tool.poetry]
name = "simple_app"
version = "0.1.0"
description = ""
authors = ["Your Name <[email protected]>"]
版本管理
Poetry 提供了方便的版本管理功能,可以使用 poetry version 命令來更新專案版本。
$ poetry version patch
依賴管理
Poetry 的另一個重要功能是依賴管理。可以使用 poetry add 命令來新增依賴套件。
$ poetry add pyramid gunicorn
這將更新 pyproject.toml 中的 tool.poetry.dependencies 區段,並生成 poetry.lock 檔案。
[tool.poetry.dependencies]
python = "^3.8"
pyramid = "^2.0"
gunicorn = "^20.1.0"
程式碼執行
Poetry 可以直接執行專案程式碼,無需明確建立虛擬環境。
$ poetry run gunicorn simple_app.web
Pipenv 的基本使用
Pipenv 是另一款流行的 Python 專案管理工具,它提供了虛擬環境管理和依賴管理的功能。使用 Pipenv 建立新專案需要先建立一個新的目錄,然後在該目錄中執行 pipenv install 命令。
安裝 Pipenv
可以透過 pip 安裝 Pipenv。
$ pip install pipenv
建立虛擬環境
Pipenv 可以自動建立虛擬環境,並在其中安裝依賴套件。
$ pipenv install termcolor
執行程式碼
Pipenv 提供了一個 pipenv shell 命令,可以開啟一個新的 shell 並啟用虛擬環境。
$ pipenv shell
(pipenv)$ python -m useful
Poetry 與 Pipenv 的比較
Poetry 和 Pipenv 都是優秀的 Python 專案管理工具,但它們有不同的設計目標和功能特點。Poetry 更注重於套件管理和釋出,而 Pipenv 則更側重於虛擬環境管理和依賴管理。
Poetry 的優勢
- 更方便的套件管理功能
- 自動生成
pyproject.toml和poetry.lock檔案 - 提供更豐富的命令列工具
Pipenv 的優勢
- 自動建立和管理虛擬環境
- 簡單易用的依賴管理功能
程式碼範例:簡單的 Pyramid 應用程式
以下是一個簡單的 Pyramid 應用程式範例,使用 Poetry 管理依賴關係。
# simple_app/web.py
from pyramid import config, response
def root(request):
return response.Response("Useful string")
with config.Configurator() as cfg:
cfg.add_route("root", "/")
cfg.add_view(root, route_name='root')
application = cfg.make_wsgi_app()
Poetry 的工作流程
@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle
title Python 專案管理與互動式環境
package "Python 應用架構" {
package "應用層" {
component [主程式] as main
component [模組/套件] as modules
component [設定檔] as config
}
package "框架層" {
component [Web 框架] as web
component [ORM] as orm
component [非同步處理] as async
}
package "資料層" {
database [資料庫] as db
component [快取] as cache
component [檔案系統] as fs
}
}
main --> modules : 匯入模組
main --> config : 載入設定
modules --> web : HTTP 處理
web --> orm : 資料操作
orm --> db : 持久化
web --> cache : 快取查詢
web --> async : 背景任務
async --> fs : 檔案處理
note right of web
Flask / FastAPI / Django
end note
@enduml
此圖示展示了使用 Poetry 管理 Python 專案的工作流程,從建立新專案到釋出套件的整個過程。透過這個流程,可以清晰地瞭解 Poetry 在專案管理中的角色和作用。
DevPI:一個強大的PyPI相容伺服器
DevPI是一個用於管理Python套件的伺服器,它與PyPI相容,可以在本機執行。雖然它不能像PyPI那樣擴充套件到大規模的使用,但它在許多情況下是一個非常有用的工具。
DevPI的組成部分
DevPI由三個部分組成:
- devpi-server:這是DevPI最核心的部分,它作為一個快取代理伺服器來提供PyPI上的套件。它利用了PyPI上的套件是不可變的這一事實:一旦你有了某個套件,它就永遠不會改變。
- Web伺服器:這個部分是可選的,它允許你在本地的套件目錄中進行搜尋。
- 客戶端命令列工具:這個工具允許你對正在執行的DevPI例項進行各種引數的組態。
安裝和執行DevPI
在虛擬環境中安裝和執行DevPI非常簡單。你可以使用以下命令:
(devpi)$ pip install devpi-server
(devpi)$ devpi-init
(devpi)$ devpi-server
組態pip使用DevPI
預設情況下,pip會連線到pypi.org。要測試DevPI,你可以建立一個新的虛擬環境,並執行:
(playground)$ pip install -i http://localhost:3141/root/pypi/+simple/ httpie glom
為了避免每次都要指定-i引數,你可以將組態寫入環境變數中:
$ export PIP_INDEX_URL=http://localhost:3141/root/pypi/+simple/
或者,你可以組態一個pip.conf檔案:
[global]
index-url = http://localhost:3141/root/pypi/+simple/
[search]
index = http://localhost:3141/root/pypi/
DevPI的用途
DevPI在以下情況下非常有用:
- 斷網操作:DevPI可以快取所需的套件,使得在沒有網路連線的情況下也可以安裝套件。
- 避免left-pad事件:透過在建置叢集中組態DevPI,可以避免因為某個套件被作者從PyPI中移除而導致的問題。
- 測試上傳:你可以使用DevPI來測試套件的上傳,然後再將其上傳到PyPI。
使用DevPI進行上傳和映象
你可以透過twine將套件上傳到DevPI:
(devpi)$ twine upload --repository-url http://localhost:3141/testuser/dev -u testuser -p 123 boltons-21.0.0-py2.py3-none-any.whl
你也可以將DevPI組態為上游DevPI伺服器的映象:
(devpi)$ devpi index root/pypi mirror_url=https://ourdevpi.local
這樣,你就可以將私人套件上傳到中央DevPI伺服器,以便與團隊分享。
Python 的互動式使用
Python 經常被用於探索性程式設計。通常,結果不是程式本身,而是對某個問題的答案。對於科學家來說,這個問題可能是關於某種醫療干預措施的有效性;對於電腦故障排除人員來說,這個問題可能是哪個日誌檔案包含了所需的訊息。
無論問題是什麼,Python 經常可以成為一個強大的工具來回答它。更重要的是,在探索性程式設計中,你可以預期根據答案遇到更多問題。
REPL 環境
Python 中的互動式模型源自原始的 Lisp 環境,稱為 Read-Eval-Print Loop(REPL)。該環境讀取 Python 表示式,在記憶體中持久化的環境中評估它,列印結果,然後迴圈回來。
Python 原生的 REPL 環境很受歡迎,因為它是內建的。然而,一些第三方 REPL 工具甚至更為強大,能夠做到原生環境無法或不願意做的事情。這些工具提供了一種強大的方式來與作業系統互動,探索和修改直到達到所需狀態。
基本控制檯
基本控制檯具有內建的優勢;它在 Python 所在的任何地方都可用。除了可以直接使用外,它還可以使用內建的 code 模組直接從 Python 自定義,允許組織特定的 Python REPL。
增強互動式控制檯體驗
IPython 和 ptpython 互動式環境專注於增強互動式控制檯體驗。IPython 專注於可擴充套件性和歷史記錄,而 ptpython 專注於使用終端的功能來提供頂級的 UI 體驗。
IPython
IPython 是一個強大的互動式 shell,提供了許多有用的功能,如語法高亮、自動補全和對話式除錯。
ptpython
ptpython 是一個 Python 的 REPL 環境,它使用了豐富的終端功能來提供更好的使用者經驗。它支援語法高亮、自動補全和其他功能。
Jupyter
Jupyter 使用通用的瀏覽器 UI 來擁有一個支援內聯圖形輸出、互動式 UI 元素(如按鈕和文字輸入)的 REPL,並支援類別似 IPython 的瀏覽器內體驗,該體驗分享相同的 Python 環境。Jupyter 也支援筆記本,一種以可分享方式儲存 REPL 會話的方法。這些筆記本可以附加到票證或甚至簽入到版本控制系統中。
# 使用 Jupyter Notebook
# 首先安裝 Jupyter
!pip install jupyter
# 啟動 Jupyter Notebook
!jupyter notebook
內容解密:
上述程式碼展示瞭如何安裝和啟動 Jupyter Notebook。首先,我們使用 pip 安裝 Jupyter。然後,我們啟動 Jupyter Notebook 伺服器。這將允許我們在瀏覽器中建立和編輯筆記本。
Jupyter 筆記本是一種強大的工具,用於探索性資料分析、科學計算和教育。它的互動式特性使得測試想法和視覺化結果變得容易。
Python 互動式環境的進階應用
Python 提供多種互動式環境,能夠即時執行程式碼並獲得回饋,適合用於探索性程式設計、教學和協作。這些工具使開發者能夠快速測試想法、驗證假設並進行除錯。
原生控制檯(Native Console)
直接執行 Python 而不帶任何引數,即可開啟互動式控制檯。這是 Python 最基本的互動方式,能夠立即對輸入的指令做出回應。建議使用 pyenv 或虛擬環境來確保使用正確的 Python 版本。
使用原生控制檯進行互動
原生控制檯使用 GNU readline 函式庫提供編輯功能。如果 Python 在編譯時未包含 readline 支援,將導致控制檯體驗下降。安裝 readline 支援後,Python 可使用它來支援行編輯和歷史記錄。
>>> import os
>>> os.path.isfile(os.path.expanduser("~/.bashrc"))
True
上述範例檢查使用者主目錄中是否存在 .bashrc 檔案。根據系統和使用者設定的不同,回傳值可能為 True 或 False。
儲存控制檯歷史記錄
使用 readline.write_history_file 可將控制檯歷史記錄儲存到檔案中,方便稍後參考或將有用的指令複製到更永久的形式。
>>> import readline, os
>>> readline.write_history_file(os.path.expanduser("~/.python-history"))
使用 _ 變數
在控制檯中,_ 變數儲存最後一個運算式的結果。這在需要保留運算式結果以供後續使用時非常有用。
>>> import requests
>>> requests.get("http://en.wikipedia.org")
<Response [200]>
>>> a = _
>>> a.text[:50]
'<!DOCTYPE html>\n<html class="client-nojs" lang="en'
內容解密:
import requests:匯入requests模組,用於傳送 HTTP 請求。requests.get("http://en.wikipedia.org"):傳送 GET 請求到指定的 URL,並回傳一個Response物件。a = _:將最後一個運算式的結果(即Response物件)儲存在變數a中。a.text[:50]:取得回應內容的前 50 個字元。
Code 模組
code 模組允許開發者執行自訂的互動式迴圈。這在需要在特定環境或狀態下執行命令時非常有用。
使用 code.interact
>>> import code
>>> code.interact(banner="Welcome to the special interpreter", local=dict(special=[1, 2, 3]))
Welcome to the special interpreter
>>> special
[1, 2, 3]
>>> ^D
now exiting InteractiveConsole...
使用 code.compile_command
code.compile_command(source, filename="<input>", symbol="single")
這個函式用於編譯單一指令,並根據指令的完整性和正確性回傳不同的結果。
內容解密:
code.compile_command:編譯指定的原始碼。source:要編譯的原始碼字串。filename="<input>":指定原始碼的檔名,預設為<input>。symbol="single":指定編譯模式,預設為"single",表示單一指令。
ptpython
ptpython 是內建 REPL 的替代方案,使用 prompt toolkit 進行控制檯互動,提供簡便的安裝方式和更高的互動品質。
安裝 ptpython
pip install ptpython
ptpython 的功能
- 自動完成建議
- 多行編輯
- 語法突顯
設定 ptpython
ptpython 在啟動時會讀取 ~/.ptpython/config.py,允許使用者自訂其行為。
def configure(repl):
# 自訂設定
pass
內容解密:
pip install ptpython:安裝ptpython。ptpython的功能:提供自動完成、多行編輯和語法突顯等功能。~/.ptpython/config.py:用於自訂ptpython的設定檔。configure函式:用於定義自訂設定的函式。
互動式開發工具的進階應用
在軟體開發與資料科學領域中,互動式開發工具扮演著越來越重要的角色。這些工具不僅提升了開發效率,也增強了程式碼的可讀性與可維護性。本篇文章將探討多種互動式開發工具的特點、應用場景及自訂組態方法。
ptpython:增強型的 Python REPL
ptpython 是對原生 Python REPL 的增強,提供了語法高亮、自動補全等功能,極大地改善了互動式程式設計的體驗。其設定檔 config.py 可以是任意 Python 指令碼,這意味著使用者可以根據需求自訂組態,甚至可以透過內部 PyPI 套件進行組態管理。
IPython:科學計算的強大工具
IPython 是 Jupyter 的基礎,源自科學計算社群。它為使用者提供了一個成熟的互動式環境,不僅支援自動補全、內建幫助檔案,還允許透過 % 開頭的 Magic 命令執行特殊操作,如執行 Python 指令碼或啟動編輯器。IPython 的輸入輸出歷史被儲存在 In 和 Out 陣列中,方便使用者參照之前的計算結果。
IPython 自訂組態
IPython 提供了多種自訂組態方式,包括在互動式會話中使用 %config 命令、在啟動時透過命令列引數設定,或是透過專門的 Python 指令碼進行組態。這使得團隊能夠分享一致的 IPython 組態。
from traitlets import config
import IPython
my_config = config.Config()
my_config.InteractiveShell.autocall = True
IPython.start_ipython(config=my_config)
內容解密:
這段程式碼展示瞭如何透過 Python 指令碼自訂 IPython 的組態。首先,從 traitlets 匯入 config 模組,並匯入 IPython。然後,建立一個 Config 物件,並設定 InteractiveShell.autocall 屬性為 True,這使得 IPython 在遇到可呼叫的表示式時自動呼叫,即使沒有加上括號。最後,使用自訂的組態啟動 IPython。
JupyterLab:新一代的互動式開發環境
JupyterLab 是 Jupyter 的最新版本,提供了一個功能全面的網頁介面,用於編輯檔案、執行 Notebook 等。它最初根據 IPython,但現在已經擴充套件到支援多種程式語言。JupyterLab 非常適合科學計算和資料科學領域,因為它支援重現性和同行評審。
安裝與使用 JupyterLab
安裝 JupyterLab 只需執行 pip install jupyterlab。啟動後,它會在本地啟動一個網頁伺服器,並嘗試開啟瀏覽器存取。若遇到問題,可以手動複製輸出的預授權 URL 到瀏覽器中存取。
JupyterLab 提供了四種主要的功能:Console、Terminal、Text editor 和 Notebook。這些功能使得使用者能夠靈活地進行互動式開發和資料分析。