如何指定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
相关产品推荐
相关产品推荐

