Python 확장 빌드 및 CMake의 필요성
경우 C 라이브러리를 통합하는 Python 확장을 개발하는 CMake는 빌드 프로세스를 관리하기 위한 포괄적인 도구를 제공합니다. 그러나 일반적인 작업 흐름에는 setup.py bdist_wheel을 실행하기 전에 CMake를 사용하여 라이브러리를 수동으로 컴파일하는 작업이 포함됩니다. 이는 불편하고 시간이 많이 걸릴 수 있습니다.
setup.py에서 CMake 호출
이 문제를 해결하기 위해 CMake를 setup.py 빌드 프로세스에 통합할 수 있습니다. . 핵심은 CMake를 활용하여 확장을 구성하고 빌드하는 사용자 정의 build_ext 명령을 생성하는 것입니다.
build_ext 명령 사용자 정의
setup.py 파일에서 build_ext 명령 클래스를 만들고 이를 명령 클래스에 등록합니다. 사용자 정의 구현 내에서 CMake를 구성하고 호출하여 확장 모듈을 빌드합니다.
샘플 프로젝트 및 설정 스크립트
개념을 보여주기 위해 C를 사용하는 간단한 프로젝트를 고려해 보세요. 확장 프로그램(foo) 및 Python 모듈(spam.eggs). setup.py 스크립트는 원래 build_ext를 호출하지 않고 확장을 캡슐화하는 CMakeExtension 클래스를 활용합니다. build_cmake 메소드는 CMake 구성 및 빌드 단계를 처리합니다.
<code class="python">import os import pathlib from setuptools import setup, Extension from setuptools.command.build_ext import build_ext_orig class CMakeExtension(Extension): def __init__(self, name): # don't invoke the original build_ext for this special extension super().__init__(name, sources=[]) class build_ext(build_ext_orig): def run(self): for ext in self.extensions: self.build_cmake(ext) super().run() def build_cmake(self, ext): cwd = pathlib.Path().absolute() # these dirs will be created in build_py, so if you don't have # any python sources to bundle, the dirs will be missing build_temp = pathlib.Path(self.build_temp) build_temp.mkdir(parents=True, exist_ok=True) extdir = pathlib.Path(self.get_ext_fullpath(ext.name)) extdir.mkdir(parents=True, exist_ok=True) # example of cmake args config = 'Debug' if self.debug else 'Release' cmake_args = [ '-DCMAKE_LIBRARY_OUTPUT_DIRECTORY=' + str(extdir.parent.absolute()), '-DCMAKE_BUILD_TYPE=' + config ] # example of build args build_args = [ '--config', config, '--', '-j4' ] os.chdir(str(build_temp)) self.spawn(['cmake', str(cwd)] + cmake_args) if not self.dry_run: self.spawn(['cmake', '--build', '.'] + build_args) setup( name='spam', version='0.1', packages=['spam'], ext_modules=[CMakeExtension('spam/foo')], cmdclass={ 'build_ext': build_ext, } )</code>
테스트 및 검증
프로젝트 휠을 빌드하고 설치하면 라이브러리가 제대로 작동하는지 확인할 수 있습니다. 성공적으로 설치되었으며 작동합니다. spam.eggs 모듈에서 래퍼 기능을 실행하면 예상한 출력이 생성됩니다.
위 내용은 Python 확장을 구축하기 위해 CMake를 setup.py에 통합하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!