如何在setup.py中添加自定义参数使其支持pip install -e模式调用
问题根因
pip install 后面跟的参数默认会被pip本身解析,你自定义的--bla不是pip的原生参数,所以直接报错。pip和setup.py的参数是完全隔离的,需要用特定格式将参数透传给setup.py,同时你直接硬读sys.argv的实现方式也不符合setuptools的标准规范,兼容性差。
标准实现方案
不要直接读取sys.argv,而是通过重写setuptools的命令类注册自定义参数,该方案可同时兼容wheel构建、普通安装、可编辑安装三种场景:
from setuptools import setup, find_packages from setuptools.command.install import install from setuptools.command.develop import develop from wheel.bdist_wheel import bdist_wheel # 复用参数处理逻辑 def run_bla_logic(): print('bla!') # 适配普通安装命令 class CustomInstall(install): user_options = install.user_options + [ ('bla', None, '自定义参数bla'), ] def initialize_options(self): super().initialize_options() self.bla = None def run(self): if self.bla: run_bla_logic() super().run() # 适配可编辑安装命令(对应pip install -e) class CustomDevelop(develop): user_options = develop.user_options + [ ('bla', None, '自定义参数bla'), ] def initialize_options(self): super().initialize_options() self.bla = None def run(self): if self.bla: run_bla_logic() super().run() # 适配wheel构建命令 class CustomBdistWheel(bdist_wheel): user_options = bdist_wheel.user_options + [ ('bla', None, '自定义参数bla'), ] def initialize_options(self): super().initialize_options() self.bla = None def run(self): if self.bla: run_bla_logic() super().run() setup( name='my_pkg', packages=find_packages(), cmdclass={ 'install': CustomInstall, 'develop': CustomDevelop, 'bdist_wheel': CustomBdistWheel } )
各场景正确用法
- 直接构建wheel包:
python setup.py bdist_wheel --bla和你原有用法一致 - 普通pip安装传参:
pip install . --install-option="--bla" - 可编辑模式pip安装传参:
pip install -e . --install-option="--bla"
如果使用pip 21.3及以上版本,默认开启了PEP 517构建隔离,--install-option会失效,需要额外加--no-build-isolation参数关闭隔离:
pip install -e . --no-build-isolation --install-option="--bla"
内容的提问来源于stack exchange,提问作者CIsForCookies
相关产品推荐
相关产品推荐

