如何手动调用ninja编译PyTorch的C++扩展,无需每次执行pip?
手动编译pybind11扩展的方法
方法1:直接调用setup.py的build_ext命令
这是适配你当前配置最便捷的方案,不需要手动处理构建配置,直接执行以下命令即可:
python setup.py build_ext --inplace
该命令会直接触发torch的CppExtension构建流程,默认调用ninja完成编译,编译生成的扩展库(.so/.pyd文件)会直接输出到项目根目录,跳过了pip install流程中的依赖校验、包元数据生成、软链接创建等冗余步骤,耗时仅等于C++代码的编译时长。
方法2:直接手动调用ninja
只要你已经运行过一次build_ext命令,构建目录下就会自动生成ninja的配置文件,后续修改C++代码后可以直接调用ninja编译,连构建配置生成的步骤都能省略:
- 找到构建生成的ninja配置目录,默认路径为
./build/temp_<系统架构>_<Python版本>/,比如Linux下Python3.10对应的路径就是./build/temp.linux-x86_64-cpython-310/ - 进入该目录后执行
ninja命令即可完成增量编译 - 编译完成后把生成的扩展库文件复制到项目根目录即可使用
额外优化建议
- 如果你修改的是纯Python代码,完全不需要重新编译C扩展,只有修改
TaskManager.cpp等C源码时才需要执行编译操作 - 可以在项目根目录创建Makefile简化操作,示例内容:
# 直接通过setup.py编译 build: python setup.py build_ext --inplace # 直接调用ninja增量编译 fast-build: cd ./build/temp* && ninja && cp *.so ../../
之后每次编译仅需执行make build或者make fast-build即可。
内容的提问来源于stack exchange,提问作者Felix
相关产品推荐
相关产品推荐

