setup.py的作用是定義和配置可安裝的python包,用于聲明包名、版本、依賴等信息。它通過(guò)調(diào)用setuptools.setup()函數(shù)實(shí)現(xiàn)包的構(gòu)建與安裝邏輯,常用于傳統(tǒng)項(xiàng)目中。編寫時(shí)需注意使用find_packages()自動(dòng)發(fā)現(xiàn)包結(jié)構(gòu),install_requires聲明依賴項(xiàng),并填寫作者、描述等元數(shù)據(jù)。常見(jiàn)注意事項(xiàng)包括:手動(dòng)更新版本號(hào)、避免打包測(cè)試代碼、合理使用console_scripts定義入口腳本、區(qū)分運(yùn)行依賴與開(kāi)發(fā)依賴。雖然setup.py仍是許多老項(xiàng)目的核心工具,但新項(xiàng)目推薦使用pyproject.toml等現(xiàn)代方案替代。
在python項(xiàng)目中,setup.py的作用主要是定義和配置一個(gè)可安裝的python包。它不是必須的(現(xiàn)在也有其他工具如pyproject.toml),但在很多傳統(tǒng)項(xiàng)目和工具鏈中仍然非常常見(jiàn)。簡(jiǎn)單來(lái)說(shuō),它是告訴pip、setuptools等工具“這個(gè)包叫什么、包含哪些內(nèi)容、依賴哪些庫(kù)”等信息的核心文件。
什么是setup.py
setup.py是一個(gè)python腳本,通常放在項(xiàng)目的根目錄下。它的核心作用是調(diào)用setuptools.setup()函數(shù)來(lái)聲明包的元數(shù)據(jù)和構(gòu)建邏輯。當(dāng)你運(yùn)行 python setup.py install 或者 pip install . 時(shí),系統(tǒng)就會(huì)讀取這個(gè)文件并據(jù)此安裝你的包。
它里面常見(jiàn)的字段包括:
- name: 包名
- version: 版本號(hào)
- packages: 要打包的模塊列表
- install_requires: 安裝依賴
- author, description, url 等基本信息
如何編寫一個(gè)基本的setup.py
寫一個(gè)可用的setup.py其實(shí)不難,重點(diǎn)在于結(jié)構(gòu)清晰、信息準(zhǔn)確。下面是一個(gè)最簡(jiǎn)示例:
立即學(xué)習(xí)“Python免費(fèi)學(xué)習(xí)筆記(深入)”;
from setuptools import setup, find_packages setup( name='my_package', version='0.1.0', packages=find_packages(), install_requires=[ 'requests', 'numpy' ], author='Your Name', description='A simple example package', url='https://github.com/yourname/yourrepo', )
關(guān)鍵點(diǎn)說(shuō)明:
- 使用 find_packages() 可以自動(dòng)發(fā)現(xiàn)所有含 __init__.py 的目錄作為包
- install_requires 用來(lái)聲明依賴項(xiàng),確保用戶安裝時(shí)不缺組件
- 盡量填寫完整作者、描述等信息,這對(duì)發(fā)布到PyPI很重要
常見(jiàn)注意事項(xiàng)和坑點(diǎn)
雖然setup.py看起來(lái)簡(jiǎn)單,但實(shí)際使用中還是有幾個(gè)容易忽略的地方:
-
版本號(hào)更新要手動(dòng)改:不像某些語(yǔ)言可以自動(dòng)生成,Python包的版本號(hào)需要你每次發(fā)版時(shí)手動(dòng)修改。
-
不要把測(cè)試代碼打進(jìn)包里:如果你用了find_packages(),記得加上 exclude=[‘tests*’] 避免誤打包。
-
入口腳本可以用console_scripts定義:比如你想讓用戶通過(guò)命令行直接運(yùn)行某個(gè)腳本,可以加:
entry_points={ 'console_scripts': [ 'mycmd=my_package.cli:main', ], },
-
注意區(qū)分開(kāi)發(fā)依賴和運(yùn)行依賴:有些庫(kù)只是用于測(cè)試或構(gòu)建文檔,不應(yīng)該出現(xiàn)在install_requires里。可以通過(guò)extras_require來(lái)分組管理。
是否還值得繼續(xù)用setup.py
雖然setup.py很經(jīng)典,但現(xiàn)在官方推薦使用pyproject.toml配合build或者poetry等現(xiàn)代工具來(lái)管理項(xiàng)目。setup.py本身已經(jīng)被標(biāo)記為“l(fā)egacy”,但目前仍有大量項(xiàng)目依賴它,尤其是企業(yè)內(nèi)部的老項(xiàng)目。
所以結(jié)論是:如果你維護(hù)的是老項(xiàng)目,了解和掌握setup.py依然是必要的;如果是新項(xiàng)目,可以考慮更現(xiàn)代化的方式,但理解它的原理仍然有幫助。
基本上就這些。setup.py不算復(fù)雜,但細(xì)節(jié)很容易忽略,特別是在版本管理和依賴控制上,稍不注意就可能讓使用者踩坑。