You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何指定Cython编译产物输出至虚拟环境site-packages目录?

如何指定Cython编译后.so文件的输出路径及build文件夹位置

1. 指定build文件夹的创建位置

你可以通过两种方式自定义build文件夹的位置:

  • 代码内指定:在setup函数中添加build_dir参数,直接定义build目录的绝对路径:
from distutils.core import setup
from Cython.Build import cythonize

def main():
    all_files = get_all_files(BASE_DIR)
    py_files = [file for file in all_files if file.suffix =='.py']
    py_file_strings = convert_to_str(py_files)
    
    # 替换为你期望的build文件夹路径(比如虚拟环境内的目录)
    setup(
        ext_modules=cythonize(py_file_strings, compiler_directives={"language_level": "3"}),
        build_dir="/path/to/virtualenvs/lib/python/site-packages/my_pip_installed_package/build"
    )
  • 命令行参数指定:执行脚本时通过--build-dir参数传入路径:
python your_script.py build_ext --build-dir /path/to/your/custom/build/folder

2. 指定.so文件的输出目标路径

要将编译后的.so文件直接部署到虚拟环境site-packages的目标目录,推荐两种方式:

方式一:通过install_lib参数直接安装

修改setup函数,添加install_lib参数指向目标目录,然后执行install命令完成编译+部署:

def main():
    all_files = get_all_files(BASE_DIR)
    py_files = [file for file in all_files if file.suffix =='.py']
    py_file_strings = convert_to_str(py_files)
    
    # 替换为虚拟环境中my_pip_installed_package/folder的实际绝对路径
    target_lib_dir = "/path/to/virtualenvs/lib/python/site-packages/my_pip_installed_package/folder"
    
    setup(
        ext_modules=cythonize(py_file_strings, compiler_directives={"language_level": "3"}),
        install_lib=target_lib_dir
    )

运行命令:

python your_script.py install

编译后的.so文件会自动复制到指定的target_lib_dir下。

方式二:编译后手动复制(灵活可控)

如果不需要通过install命令,可先编译到指定build目录,再手动复制.so文件到目标路径:

import shutil
import os
from distutils.core import setup
from Cython.Build import cythonize

def main():
    all_files = get_all_files(BASE_DIR)
    py_files = [file for file in all_files if file.suffix =='.py']
    py_file_strings = convert_to_str(py_files)
    
    # 自定义build文件夹路径
    custom_build_dir = "/path/to/custom/build"
    setup(
        ext_modules=cythonize(py_file_strings, compiler_directives={"language_level": "3"}),
        build_dir=custom_build_dir
    )
    
    # 遍历build目录找出所有.so文件
    so_files = []
    for root, _, files in os.walk(custom_build_dir):
        so_files.extend([os.path.join(root, f) for f in files if f.endswith('.so')])
    
    # 目标路径
    target_dir = "/path/to/virtualenvs/lib/python/site-packages/my_pip_installed_package/folder"
    os.makedirs(target_dir, exist_ok=True)
    
    # 复制所有.so文件到目标目录
    for so_file in so_files:
        shutil.copy(so_file, target_dir)

执行该脚本即可完成编译和复制操作。

注意:如果你的私有包是标准Python包结构(包含__init__.py),也可以配置packages和package_dir参数,让setup工具自动识别包结构并完成部署,这更符合Python包的规范。

内容的提问来源于stack exchange,提问作者mastrshayk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 01:11:32