>백엔드 개발 >C++ >setup.py 내에서 CMake를 사용하여 Python 확장 빌드를 어떻게 간소화할 수 있나요?

setup.py 내에서 CMake를 사용하여 Python 확장 빌드를 어떻게 간소화할 수 있나요?

Susan Sarandon
Susan Sarandon원래의
2024-10-26 21:56:02368검색

 How can you streamline Python extension builds using CMake within setup.py?

CMake를 사용하여 빌드 확장 서브클래싱

소개:

C 코드로 Python을 확장하려면 컴파일 단계와 연결 단계를 신중하게 조정해야 합니다. . 이 프로세스를 단순화하기 위해 CMake는 이러한 확장을 구성하고 빌드하는 편리한 방법을 제공합니다. 그러나 CMake를 setup.py와 통합하는 것은 개발자에게 어려움을 안겨주었습니다. 이 문서의 목표는 setup.py 빌드에서 CMake를 원활하게 사용하기 위해 setuptool을 확장하여 이러한 문제를 해결하는 것입니다.

통합의 필요성:

전통적으로 Python 확장은 다음과 같습니다. setup.py를 실행하기 전에 컴파일하고 링크하면 지루한 2단계 프로세스가 생성됩니다. CMake를 활용하면 개발자는 복잡한 빌드 시퀀스를 세밀하게 제어할 수 있습니다. 또한 CMake의 Python 확장 지원을 통해 setup.py에서 직접 쉽게 컴파일할 수 있으므로 중간 단계가 필요하지 않습니다.

빌드 확장 사용자 정의:

CMake를 설정에 통합하려면 .py, 사용자 정의 확장 클래스가 필요합니다. 이 하위 클래스인 CMakeExtension은 대신 CMake 명령을 호출하도록 기본 빌드 동작을 재정의합니다.

통합 예:

C 확장(foo)을 포함하는 간단한 프로젝트 구조를 고려하세요. 및 Python 모듈(spam.eggs). CMakeLists.txt 및 setup.py 파일은 빌드 프로세스에서 중요한 역할을 합니다.

# CMakeLists.txt
project(spam)
set(src "spam")
set(foo_src "spam/foo.c")
add_library(foo SHARED ${foo_src})

# setup.py
from setuptools import setup, Extension
from setuptools.command.build_ext import build_ext_orig

class CMakeExtension(Extension):
    def __init__(self, name):
        super().__init__(name, sources=[])

class build_ext(build_ext_orig):
    def run(self):
        for ext in self.extensions:
            self.build_cmake(ext)
        super().run()

CMakeExtension 클래스는 빌드 프로세스 중에 CMake만 호출하는 특수 확장으로 자체 등록하는 반면, 사용자 정의된 build_ext는 CMake를 호출하는 기본 동작.

빌드 테스트:

프로젝트 빌드에는 setup.py sdist bdist_wheel 실행이 포함됩니다. 결과 휠 배포판은 pip show를 사용하여 설치하고 테스트하여 Python 확장 라이브러리(libfoo.dylib)가 있는지 확인할 수 있습니다. spam.eggs에서 래퍼 함수를 ​​호출하면 확장 프로그램이 예상대로 작동하는지 확인할 수 있습니다.

결론:

setup.py에서 CMake를 사용하여 setuptools를 확장하면 빌드에 대한 간소화된 접근 방식을 제공합니다. 복잡한 빌드 시퀀스를 위해 CMake를 사용하는 Python 확장입니다. 이를 통해 개발자는 이 두 도구를 원활하게 통합하여 수동 단계를 줄이고 개발 워크플로우를 향상할 수 있습니다.

위 내용은 setup.py 내에서 CMake를 사용하여 Python 확장 빌드를 어떻게 간소화할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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