如何配置setup.py让Cython仅生成.PYD文件 隐藏.C与BUILD目录
Cython编译隐藏中间文件setup.py实现方案
核心实现逻辑
- 借助系统临时目录存放所有编译中间产物,全程不会在用户工作目录生成C文件、build目录等内容
- 临时目录默认仅当前操作用户可访问,编译完成后自动销毁无残留,完全避免中间文件泄露
- 最终仅输出.pyd文件到指定目录,符合闭源分发的要求
完整可运行代码
import os import shutil import tempfile from setuptools import Extension, setup from Cython.Build import cythonize if __name__ == "__main__": # -------------------------- 自定义配置区 -------------------------- # 替换为你需要编译的.pyx文件路径,支持多文件 pyx_source_list = ["./your_module.pyx"] # 最终生成的.pyd文件存放路径 pyd_output_path = "./dist" # ------------------------------------------------------------------- os.makedirs(pyd_output_path, exist_ok=True) # 上下文管理器自动管理临时目录生命周期,退出作用域后自动彻底删除 with tempfile.TemporaryDirectory() as temp_build_dir: # 给临时目录设置权限:仅当前用户有读写执行权限,其余用户无任何权限 os.chmod(temp_build_dir, 0o700) # 生成扩展模块配置 ext_modules = [] for pyx_path in pyx_source_list: module_name = os.path.splitext(os.path.basename(pyx_path))[0] ext_modules.append(Extension(name=module_name, sources=[pyx_path])) # 执行编译:所有中间产物全部定向到临时目录 setup( ext_modules=cythonize(ext_modules, build_dir=temp_build_dir), script_args=[ "build_ext", f"--build-base={temp_build_dir}", f"--build-lib={temp_build_dir}" ] ) # 将编译完成的.pyd文件移动到指定输出目录 for filename in os.listdir(temp_build_dir): if filename.endswith(".pyd"): target_path = os.path.join(pyd_output_path, filename) if os.path.exists(target_path): os.remove(target_path) shutil.move(os.path.join(temp_build_dir, filename), target_path)
使用说明
- 替换代码中
pyx_source_list配置项为你实际的.pyx文件路径,支持传入多个文件批量编译 - 修改
pyd_output_path可自定义.pyd文件的输出目录 - 执行
python setup.py build_ext即可完成编译,全程工作目录不会生成任何C文件、build目录等中间产物,仅输出目录下会有最终的.pyd文件 - 如在Linux下使用,将后缀判定改为
.so即可适配
内容的提问来源于stack exchange,提问作者RandomGuy
相关产品推荐
相关产品推荐

