天天看點

一日一技:setup.py裡面的兩個小技巧

一日一技:setup.py裡面的兩個小技巧

當你要自己釋出一個Python包時,下面這兩個小技巧可能對你有用。

pip安裝後執行代碼

今天公衆号粉絲群裡面,有同學提問:

一日一技:setup.py裡面的兩個小技巧

這個同學自己開發了一個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',
    version='0.1',
    packages=find_packages(),
    cmdclass={
        'install': CustomInstallCommand,
    },
)           

當你把代碼上傳到Pypi以後,使用者依然是使用pip install xxx來安裝這個包。安裝完成以後,就可以自動删除臨時檔案了。

額外依賴

大家在安裝某些第三方庫時,可能會看到它的安裝說明裡面,讓你這樣寫:

pip install "xxx[yyy]"           

如下圖所示:

一日一技:setup.py裡面的兩個小技巧

這種寫法是什麼意思呢?實際上這叫做可選的額外依賴(extras)。有一些功能比較強大的第三方庫,他需要安裝很多依賴。但是如果我隻需要使用其中的特定某個功能,那麼實際上隻需要安裝這個功能需要的依賴就可以了。根本沒有必要安裝所有依賴。

這種情況下,就可以使用額外依賴。在setup.py裡面,添加extras_require參數:

setup(
    name='your_package_name',
    version='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。