返回文章列表

Python 專案管理與互動式環境

本文探討 Python 專案管理工具 Poetry 和 Pipenv 的使用,比較它們的優缺點,並介紹如何使用 DevPI 建立 PyPI 相容伺服器。同時,文章也深入解析了 Python 互動式環境,包含原生控制檯、IPython、ptpython 和 Jupyter

Web 開發 Python

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.tomlREADME.rstsimple_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.tomlpoetry.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由三個部分組成:

  1. devpi-server:這是DevPI最核心的部分,它作為一個快取代理伺服器來提供PyPI上的套件。它利用了PyPI上的套件是不可變的這一事實:一旦你有了某個套件,它就永遠不會改變。
  2. Web伺服器:這個部分是可選的,它允許你在本地的套件目錄中進行搜尋。
  3. 客戶端命令列工具:這個工具允許你對正在執行的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 檔案。根據系統和使用者設定的不同,回傳值可能為 TrueFalse

儲存控制檯歷史記錄

使用 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'

內容解密:

  1. import requests:匯入 requests 模組,用於傳送 HTTP 請求。
  2. requests.get("http://en.wikipedia.org"):傳送 GET 請求到指定的 URL,並回傳一個 Response 物件。
  3. a = _:將最後一個運算式的結果(即 Response 物件)儲存在變數 a 中。
  4. 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")

這個函式用於編譯單一指令,並根據指令的完整性和正確性回傳不同的結果。

內容解密:

  1. code.compile_command:編譯指定的原始碼。
  2. source:要編譯的原始碼字串。
  3. filename="<input>":指定原始碼的檔名,預設為 <input>
  4. symbol="single":指定編譯模式,預設為 "single",表示單一指令。

ptpython

ptpython 是內建 REPL 的替代方案,使用 prompt toolkit 進行控制檯互動,提供簡便的安裝方式和更高的互動品質。

安裝 ptpython

pip install ptpython

ptpython 的功能

  • 自動完成建議
  • 多行編輯
  • 語法突顯

設定 ptpython

ptpython 在啟動時會讀取 ~/.ptpython/config.py,允許使用者自訂其行為。

def configure(repl):
    # 自訂設定
    pass

內容解密:

  1. pip install ptpython:安裝 ptpython
  2. ptpython 的功能:提供自動完成、多行編輯和語法突顯等功能。
  3. ~/.ptpython/config.py:用於自訂 ptpython 的設定檔。
  4. configure 函式:用於定義自訂設定的函式。

互動式開發工具的進階應用

在軟體開發與資料科學領域中,互動式開發工具扮演著越來越重要的角色。這些工具不僅提升了開發效率,也增強了程式碼的可讀性與可維護性。本篇文章將探討多種互動式開發工具的特點、應用場景及自訂組態方法。

ptpython:增強型的 Python REPL

ptpython 是對原生 Python REPL 的增強,提供了語法高亮、自動補全等功能,極大地改善了互動式程式設計的體驗。其設定檔 config.py 可以是任意 Python 指令碼,這意味著使用者可以根據需求自訂組態,甚至可以透過內部 PyPI 套件進行組態管理。

IPython:科學計算的強大工具

IPython 是 Jupyter 的基礎,源自科學計算社群。它為使用者提供了一個成熟的互動式環境,不僅支援自動補全、內建幫助檔案,還允許透過 % 開頭的 Magic 命令執行特殊操作,如執行 Python 指令碼或啟動編輯器。IPython 的輸入輸出歷史被儲存在 InOut 陣列中,方便使用者參照之前的計算結果。

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。這些功能使得使用者能夠靈活地進行互動式開發和資料分析。