Python setup.py pip安装时自定义函数无法执行问题排查
问题根因
你的自定义安装后逻辑不触发,核心是两个层面的问题:
- 现代pip的默认安装流程不会执行你覆写的
setuptools install命令
pip 10.0之后的版本默认遵循PEP 517构建规范,安装源码包时会先在临时隔离环境自动构建wheel包,再直接解压wheel完成安装,整个过程完全不会调用setup.py里的install命令入口,你写在cmdclass里的自定义逻辑自然不会被执行。你本地dist目录没有提前生成whl文件不影响这个流程,pip会在安装时临时生成对应wheel包。 - 你的代码本身存在可直接导致执行失败的bug
- 缺失必要导入:代码中使用了
Path、os模块,但没有写对应导入语句;错误提示用的p()函数没有定义,实际应该是print() - 依赖缺失:你的后置逻辑用到了
requests库,但没有把它加入install_requires列表,就算钩子触发,执行时也会因为找不到依赖直接报错 - 逻辑顺序问题:你现在是先执行自定义的
temp()函数,再调用父类的install.run(),此时安装流程还没完成,包的依赖、路径都没初始化完成,很容易出现路径找不到、权限不足的问题。
- 缺失必要导入:代码中使用了
解决方法
临时验证方案(仅本地测试用,不适合分发给用户)
安装时手动添加参数禁用wheel构建,强制走原生setup.py install流程:pip install <my_package> --no-binary :all:执行前先把前面提到的导入、依赖、函数名bug修复,同时注意把自定义函数的调用放到父类
run()方法之后,保证安装流程走完再执行你的逻辑:class PostInstallCommand(install): """Post-installation for installation mode.""" def run(self): install.run(self) # 先完成默认安装流程 temp() # 再执行自定义后置逻辑另外要把
requests补充到install_requires列表里。正式分发推荐方案(兼容所有pip版本、安装方式)
彻底放弃setup.py安装钩子的实现方式,这类钩子在现代Python打包体系中已经被废弃,没有稳定兼容性,而且安装阶段执行外网下载、文件写入操作很容易触发权限问题、网络问题导致安装失败。
最稳妥的实现是把后置初始化逻辑放到包的首次运行流程里:用户第一次导入你的包,或者第一次调用包的核心功能时,自动检查需要的文件是否存在,不存在就执行下载、目录创建逻辑。这种实现不依赖任何打包阶段的钩子,不管用户是用wheel安装、源码安装、开发模式安装都能正常触发,也能正确处理用户目录权限、虚拟环境路径等问题。
额外提醒:你的代码中下载请求关闭了SSL验证、直接写固定路径的操作存在安全和兼容性风险,正式使用时建议去掉
verify=False配置,路径用标准方法获取系统对应的用户数据目录,不要硬编码路径。
内容的提问来源于stack exchange,提问作者bobsmith76
相关产品推荐
相关产品推荐

