【Python】Python項目中的依賴與配置:requirements.txt、setup.py、pyproject.toml 詳解

在昨天的文章【Python】通過Editable Install模式詳解,解決Python開發總是import出錯的問題 中, 我們提到了Python項目的配置文件requirements.txtsetup.pypyproject.toml。在昨天的解決方案中, 我們同時維護了這三個文件。 由同學就問:真的需要這么復雜的同時維護三個文件嗎? 今天,田辛老師就來詳細解釋一下這三個文件。 包括他們的核心用途、演變歷史等等。 希望通過這篇文章, 讀者思考在你的項目中, 是否需要保留他們。

1. requirements.txt : 最最簡單的依賴列表

定位:最基礎的依賴聲明文件,通常用于直接安裝依賴。
用途

  • 列出項目運行所需的第三方包及其版本(例如 requests==2.25.1)。
  • 通過 pip install -r requirements.txt 一鍵安裝依賴。
  • 常用于開發環境或生成依賴快照(如 pip freeze)。

局限性

  • 僅記錄依賴包,不區分開發依賴、生產依賴或操作系統級的依賴。
  • 無法定義包的安裝方式(例如從Git倉庫或本地路徑安裝)。
  • 與項目打包(如生成 .whl 或上傳到PyPI)無關。

2. setup.py:傳統的打包配置

2.1. 定位

基于 setuptools 的打包工具配置文件,用于構建和分發Python包。

2.2. 用途

  • 定義項目元數據(名稱、版本、作者等)。
  • 聲明依賴(install_requires)、開發依賴(extras_require)以及可執行腳本。
  • 通過 python setup.py installpip install . 安裝本地包。

2.3. 示例片段

from setuptools import setupsetup(name="tdouya_tools",version="0.1",install_requires=["requests>=2.25"],extras_require={"dev": ["pytest"]},
)

2.4. 缺點:

  • 配置復雜,需要編寫Python代碼(而非聲明式配置)。
  • 依賴動態執行(可能存在安全隱患)。
  • 無法直接支持現代構建后端(如 poetryflit )。

3. pyproject.toml:現代的統一配置

3.1. 定位

PEP 518 引入的標準化配置文件,旨在統一項目構建和元數據配置。

3.2. 用途:

  • 指定構建系統的依賴(如 setuptools、poetry 或 flit)。
  • 聲明項目元數據、依賴及版本約束(遵循PEP 621標準)。
  • 支持動態依賴分離(生產依賴、開發依賴、測試依賴等)。

3.3. 示例片段

使用 PEP 621 格式

[project]
name = "my_project"
version = "0.1"
dependencies = ["requests>=2.25"][project.optional-dependencies]
dev = ["pytest"]

優勢

  • 聲明式配置:更簡潔且易于維護。
  • 兼容性:支持現代工具鏈(如 poetrypipenv)。
  • 擴展性:可整合代碼格式化、測試配置等其他工具(如 blackcoverage)。

4. 三者是否需要共存?

田老師回答: 通常不需要,但取決于項目需求和工具鏈。對于某些場景,同時保留 requirements.txt 和 setup.py 可能帶來實際價值。

4.1. 場景分析

4.1.1. 傳統項目(僅用 setuptools
  • 需要 setup.py + requirements.txt
    • setup.py 用于定義打包元數據和依賴(install_requires),適合發布到 PyPI
    • requirements.txt 可以細化開發環境依賴(如測試框架 pytest、代碼格式化工具 black),并通過 pip install -r requirements.txt 快速安裝。
    • 優勢:職責分離,setup.py 關注生產依賴和分發,requirements.txt 管理開發工具和環境復現。

    這也是田辛老師的項目中, 往往這兩個文件同時存在的原因。

4.1.2. 兼容舊工具鏈或腳本
  • 許多CI/CD流水線、自動化腳本或開發者習慣依賴 requirements.txt 快速安裝依賴。
  • 保留 setup.py 可以兼容 python setup.py install 等傳統構建命令,避免破壞遺留工作流程。
  • 示例:
    # 開發時安裝開發依賴
    pip install -r requirements.txt
    # 構建時通過 setup.py 安裝生產包
    python setup.py build
    
4.1.3. 漸進式遷移到 pyproject.toml

在過渡階段,同時保留 setup.pyrequirements.txt 可降低遷移風險:

  • pyproject.toml 定義核心配置和構建后端。
  • setup.py 作為備用接口(例如兼容未完全支持 PEP 621 的工具)。
  • requirements.txt 繼續用于開發環境依賴安裝。
4.1.4. 依賴管理的靈活性
4.1.4.1. 細粒度控制:
  • 在 requirements.txt 中指定復雜依賴(如 Git 倉庫、本地路徑或特定系統級包)。
  • 在 setup.py 的 install_requires 中僅聲明最小化生產依賴,保持分發包的輕量性。
4.1.4.2. 示例:
# setup.py 中僅保留核心依賴
install_requires = ["requests>=2.25"]
# requirements.txt 包含開發工具和環境約束
pytest==7.4.0
black==23.9.1
-e .  # 以可編輯模式安裝當前包
4.1.4.3. 關鍵決策點
  • 是否依賴舊工具或腳本:若團隊或工具鏈重度依賴 requirements.txt,保留它可以減少遷移成本。
  • 是否需要快速環境復現requirements.txt 結合 pip freeze 能生成精確的依賴快照,適合快速復制開發環境。
  • 是否需要兼容非打包場景:例如在 Dockerfile 中直接使用 requirements.txt 安裝依賴,而非通過包構建流程。

5. 最佳實踐建議

5.1. 新項目優先使用 pyproject.toml

通過 PEP 621 或工具(如 poetry)定義元數據和依賴,無需 setup.pyrequirements.txt

5. 2. 舊項目逐步遷移

保留 setup.py 但逐步將配置轉移到 pyproject.toml,例如使用 setuptools 的 [project] 表。

5.3 . 區分 requirements.txt 的使用場景

如果仍需用它,可以自動生成:

# 通過 poetry 生成
poetry export -f requirements.txt --output requirements.txt

5.4 . 避免重復聲明依賴

不要同時在 setup.pypyproject.toml 中聲明依賴,否則會導致維護負擔。

6. 結論

在現代1Python1生態中,pyproject.toml 是未來的方向,能夠取代 setup.pyrequirements.txt 的大部分功能。對于新項目,推薦僅使用 pyproject.toml 并結合工具(如 poetry)管理依賴和構建流程。舊項目可視情況逐步遷移,無需強制三者共存。最終目標是簡化配置、減少冗余,并擁抱標準化。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/80224.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/80224.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/80224.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

詳細聊聊 Synchronized,以及鎖的升級過程

在Java中,synchronized關鍵字是用于實現線程同步的重要機制,它通過內置鎖(Monitor)確保多個線程對共享資源的安全訪問。 1. synchronized 的基本使用與實現原理 使用方式 修飾實例方法:鎖是當前對象實例。public syn…

vue3的深入組件-組件 v-model

組件 v-model 基本用法? v-model 可以在組件上使用以實現雙向綁定。 從 Vue 3.4 開始&#xff0c;推薦的實現方式是使用 defineModel() 宏&#xff1a; <script setup> const model defineModel()function update() {model.value } </script><template>…

15.thinkphp的上傳功能

一&#xff0e;上傳功能 1. 如果要實現上傳功能&#xff0c;首先需要建立一個上傳表單&#xff0c;具體如下&#xff1a; <form action"http://localhost/tp6/public/upload"enctype"multipart/form-data" method"post"><input type&…

word文檔基本操作: 編輯頁眉頁腳和插入目錄

文章目錄 引言I 編輯頁眉頁腳II 插入目錄III 知識擴展基于axure畫架構圖基于Knife4j導出接口文檔基于PDManer導出數據庫設計文檔引言 背景: 信息安全認證需要準備相關文件用于審核 一般的開發設計包含總體設計、概要設計、詳細設計、接口設計、數據庫設計、部署結構設計、原型…

Qt 通過控件按鈕實現hello world + 命名規范(7)

文章目錄 使用編輯框來完成 hello world通過編輯圖形化界面方式通過純代碼方式 通過按鈕的方式來創建 hello world通過編輯圖形化界面方式通過純代碼方式 總結Qt Creator中的快捷鍵如何使用文檔命名規范 簡介&#xff1a;這篇文章著重點并不在于創建hello world程序&#xff0c…

實時網絡流量監控與防御:Python實現DDoS攻擊檢測

1. 需求分析 DDoS攻擊通過海量請求耗盡服務器資源。本文使用 Python Scapy 實時監控流量&#xff0c;自動觸發IP封禁。 2. 核心代碼實現 2.1 依賴安裝 pip install scapy psutil2.2 流量監控腳本&#xff08;ddos_detector.py&#xff09; import time from scapy.all im…

電賽經驗分享——模塊篇

1、前言 打算在這一個專欄中&#xff0c;分享一些本科控制題電賽期間的經驗&#xff0c;和大家共同探討&#xff0c;也希望能幫助剛剛參加電賽的同學&#xff0c;了解一些基本的知識。一些見解和看法可能不同或有錯誤&#xff0c;歡迎批評指正。 在本文中&#xff0c;主要介紹筆…

【LLM】Open WebUI 使用指南:詳細圖文教程

Open WebUI 是一個開源的、可擴展且用戶友好的自托管 AI 平臺,專為生成式人工智能模型交互而設計。 Open WebUI 旨在為用戶提供一個簡單易用、功能強大且高度定制化的界面,使其能夠輕松與各種 AI 模型(如文本生成、圖像生成、語音識別等)進行交互。 一、安裝與初始化配置 擴…

HarmonyOS Next~HarmonyOS應用測試全流程解析:從一級類目上架到二級類目專項測試

HarmonyOS Next&#xff5e;HarmonyOS應用測試全流程解析&#xff1a;從一級類目上架到二級類目專項測試 引言&#xff1a;HarmonyOS生態下的質量保障挑戰 在萬物互聯的智能時代&#xff0c;HarmonyOS作為分布式操作系統&#xff0c;為開發者帶來了前所未有的創新空間&#x…

一種機載掃描雷達實時超分辨成像方法——論文閱讀

一種機載掃描雷達實時超分辨成像方法 1. 專利的研究目標與產業意義1.1 研究目標與實際問題1.2 產業意義2. 專利的創新方法:滑窗遞歸優化與實時更新2.1 核心模型與公式2.2 與傳統方法對比優勢3. 實驗設計與驗證3.1 仿真參數3.2 實驗結果4. 未來研究方向與挑戰4.1 學術挑戰4.2 技…

滾筒洗衣機拆解學習

本文圖片來自于B站視頻&#xff0c;鏈接在文末&#xff0c;不涉及任何公司及實驗室產品 對小米滾筒洗衣機進行拆解&#xff0c;并收集了用戶對這款產品的評價&#xff0c;認識了關鍵部件。下一步重點學習對各個電機的控制邏輯和供電系統。 整機拆解學習&#xff1a; 功能面板…

【金倉數據庫征文】金倉數據庫 KingbaseES 在電商平臺數據庫遷移與運維中深入復現剖析

【金倉數據庫征文】金倉數據庫 KingbaseES 在電商平臺數據庫遷移與運維中深入復現剖析 前言 在當今數字化商業蓬勃發展的時代&#xff0c;電商平臺的數據量呈爆發式增長&#xff0c;對數據庫性能、穩定性和擴展性提出了極高要求。本文章基于大型電商平臺原本采用 MySQL 數據庫&…

iPhone手機連接WiFi異常解決方法

iPhone手機連接WiFi異常解決方法 一、問題現象二、iPhone連不上可能的原因三、基礎排查與快速修復第一步:重啟大法第二步:忽略網絡,重新認證第三步:關閉“私有無線局域網地址”第四步:修改DNS服務器第五步:還原網絡設置四、路由器端排查及設置關閉MAC地址過濾或添加到白名…

Android NDK版本迭代與FFmpeg交叉編譯完全指南

在Android開發中&#xff0c;使用NDK(Native Development Kit)進行原生代碼開發是一項常見需求&#xff0c;特別是當我們需要集成FFmpeg這樣的多媒體處理庫時。本文將深入分析Android NDK的版本迭代分界線&#xff0c;詳細講解FFmpeg交叉編譯的注意事項&#xff0c;并提供完整的…

typecho中的Widget設計文檔

組成系統的最基本元素 什么是Widget Widget是組成Typecho的最基本元素&#xff0c;除了已經抽象出來的類庫外&#xff0c;其它幾乎所有的功能都會通過Widget來完成。在實踐中我們發現&#xff0c;在博客這種小型但很靈活的系統中實施一些大型框架的思想是不合適的&#xff0c…

Python序列Day3

序列 序列是一種數據存儲方式&#xff0c;用方括號標注&#xff0c;逗號分隔的一組值。在內存中&#xff0c;序列就是一塊用來存放多個值的連續的內存空間。 常見序列結構有&#xff1a;字符串、列表、元組、字典、集合 列表 用于存儲任意數目&#xff0c;任意類型的數據集…

私服與外掛:刑事法律風險的深度剖析

首席數據官高鵬律師團隊編著 在當今數字化時代&#xff0c;網絡游戲產業蓬勃發展&#xff0c;然而與之相伴的私服與外掛現象卻屢禁不止&#xff0c;且其背后隱藏著嚴重的刑事法律風險。作為一名律師&#xff0c;有必要在此對私服與外掛相關的刑事問題進行深入解讀&#xff0c;以…

Linux云計算訓練營筆記day04(Rocky Linux中的命令)

mv 移動(剪切) 源數據會消失 格式: mv 源文件 目標路徑 touch /opt/a.txt 創建文件 mv /opt/a.txt /root 移動文件&#xff0c;沒有改名 mkdir gongli 創建目錄 mv gongli /opt/ 移動目錄&#xff0c;沒有改名 mv /opt/gongli tedu 移動目錄&#xff0c;改名了 …

藍橋杯青少 圖形化編程——“星星”點燈

藍橋杯青少 圖形化編程——“星星”點燈 編程實現&#xff1a; 有10盞燈&#xff0c;從1到10按順序依次編號&#xff0c;初始時全部燈處于開啟狀態。有10個人也從1到10依次編號。第一個人&#xff08;1號&#xff09;將燈全部關閉&#xff0c;第二個人&#xff08;2號&#x…

conda配置好的pytorch在jupyter中如何配置

配置 其實不用再配置了 如下圖&#xff08;主要是激活pytorch環境&#xff0c;再jupyter notebook&#xff09; jupyter運行快捷鍵shiftenter 新建文件夾folder&#xff0c;新建notebook 使用 幫助文檔&#xff08;兩種方式&#xff09; ctrl/ 注釋