>백엔드 개발 >C++ >Python 확장을 구축하기 위해 CMake를 setup.py에 통합하는 방법은 무엇입니까?

Python 확장을 구축하기 위해 CMake를 setup.py에 통합하는 방법은 무엇입니까?

Susan Sarandon
Susan Sarandon원래의
2024-10-27 12:11:02804검색

How to Integrate CMake into setup.py for Building Python Extensions?

setuptools 확장을 위해 setup.py에 CMake를 통합하는 방법

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.