一日一技:Setup.py里面的兩個小技巧
當你要自己發布一個Python包時,下面這兩個小技巧可能對你有用。
pip安裝后執行代碼
今天公眾號粉絲群里面,有同學提問:
圖片
這個同學自己開發了一個Python包,這個包在使用pip安裝時,會產生一些臨時文件。他希望安裝完成以后,能夠自動清理這些臨時文件。
要實現這個需求,可以使用Python自帶的setuptools來實現。代碼如下:
import os
from setuptools import setup, find_packages
from setuptools.command.install import install
class CustomInstallCommand(install):
"""自定義安裝命令,執行標準安裝后跟自定義代碼。"""
def run(self):
install.run(self)
print("執行自定義安裝后的代碼...")
os.remove('需要刪除的文件1路徑')
os.remove('需要刪除的文件2路徑')
print('這里可以寫任意代碼')
setup(
name='your_package_name',
versinotallow='0.1',
packages=find_packages(),
cmdclass={
'install': CustomInstallCommand,
},
)
當你把代碼上傳到Pypi以后,用戶依然是使用pip install xxx來安裝這個包。安裝完成以后,就可以自動刪除臨時文件了。
額外依賴
大家在安裝某些第三方庫時,可能會看到它的安裝說明里面,讓你這樣寫:
pip install "xxx[yyy]"
如下圖所示:
圖片
這種寫法是什么意思呢?實際上這叫做可選的額外依賴(extras)。有一些功能比較強大的第三方庫,他需要安裝很多依賴。但是如果我只需要使用其中的特定某個功能,那么實際上只需要安裝這個功能需要的依賴就可以了。根本沒有必要安裝所有依賴。
這種情況下,就可以使用額外依賴。在setup.py里面,添加extras_require參數:
setup(
name='your_package_name',
versinotallow='0.1',
packages=find_packages(),
install_requires=['requests']
extras_require={
'excel': ['pandas>=1.20.0'],
'lxml': ['lxml'],
'all': ['pandas>=1.20.0', 'lxml']
},
)
那么當用戶使用pip install xxx安裝這個包時,默認只會安裝requests一個依賴。當使用pip install "xxx[lxml]"時,會安裝requests和lxml。當使用pip install "xxx[all]"時,會安裝requests、lxml和pandas。