pip可编辑安装未触发自定义install命令的问题咨询
问题分析
常规pip install .会触发自定义install命令完成共享对象编译,但可编辑安装(pip install -e .)走的是editable_wheel/develop流程,不会触发install命令,导致编译步骤被跳过。之前重写editable_wheel时错误调用了install.run(self),而非父类的run()方法,打断了可编辑安装的后续流程,导致安装失败。
解决方案
推荐将编译步骤绑定到build阶段——这是所有安装方式(常规/可编辑)的必经流程,无需分别处理不同安装命令,实现更可靠的统一编译逻辑。
修改后的setup.py代码
import os import subprocess from typing import List from setuptools import find_namespace_packages, setup from setuptools.command.build import build class CustomBuild(build): def run(self): # 获取编译脚本的绝对路径,避免安装时工作目录变化导致找不到脚本 compile_script = os.path.abspath("./compile.sh") # 执行编译脚本,check=True会在脚本执行失败时中断安装并抛出异常 # 捕获输出方便调试编译错误 result = subprocess.run( [compile_script], check=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, text=True ) # 可选:将编译日志写入文件 with open("compile.log", "w") as f: f.write(result.stdout) # 执行父类的build流程,确保后续安装步骤正常执行 super().run() requirements: List[str] = [ # 填写你的依赖包,比如"requests>=2.28.0" ] setup( author="", python_requires=">=3.11", install_requires=requirements, name="mypkg", license="", packages=find_namespace_packages(include=["mypkg", "mypkg.*"]), cmdclass={"build": CustomBuild}, # 注册自定义build命令 include_package_data=True, zip_safe=False, )
额外注意事项
- 编译脚本权限:确保
compile.sh有可执行权限,执行命令:chmod +x compile.sh - 共享对象路径:确保编译脚本生成的
libc.*文件在MANIFEST.in能捕获的目录下(当前目录即可),保证include_package_data=True能将其纳入包中。 - 错误调试:如果编译失败,
subprocess.run的check=True会直接抛出异常,结合compile.log能快速定位问题。
内容的提问来源于stack exchange,提问作者frank
相关产品推荐
相关产品推荐

