Rumah >pembangunan bahagian belakang >C++ >Bagaimana untuk Mengintegrasikan CMake ke dalam setup.py untuk Membina Sambungan Python?
Membina Sambungan Python dan Keperluan untuk CMake
Bila membangunkan sambungan Python yang menyepadukan perpustakaan C, CMake menyediakan alat yang komprehensif untuk mengurus proses binaan. Walau bagaimanapun, aliran kerja biasa melibatkan penyusunan perpustakaan secara manual dengan CMake sebelum menjalankan setup.py bdist_wheel. Ini boleh menyusahkan dan memakan masa.
Menyebut CMake dalam setup.py
Untuk mengatasinya, adalah mungkin untuk memasukkan CMake ke dalam proses binaan setup.py . Kuncinya ialah mencipta perintah build_ext tersuai yang menggunakan CMake untuk mengkonfigurasi dan membina sambungan.
Menyesuaikan arahan build_ext
Dalam fail setup.py, gantikan build_ext kelas arahan dan daftarkannya dalam kelas arahan. Dalam pelaksanaan tersuai anda, konfigurasikan dan gunakan CMake untuk membina modul sambungan.
Contoh Projek dan Skrip Persediaan
Untuk menunjukkan konsep, pertimbangkan projek ringkas dengan C sambungan (foo) dan modul Python (spam.eggs). Skrip setup.py memanfaatkan kelas CMakeExtension yang merangkum sambungan tanpa menggunakan build_ext asal. Kaedah build_cmake mengendalikan konfigurasi CMake dan langkah membina.
<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>
Pengujian dan Pengesahan
Dengan membina roda projek dan memasangnya, anda boleh mengesahkan sama ada perpustakaan itu berjaya dipasang dan berfungsi. Menjalankan fungsi pembungkus daripada modul spam.eggs harus menghasilkan output yang diharapkan.
Atas ialah kandungan terperinci Bagaimana untuk Mengintegrasikan CMake ke dalam setup.py untuk Membina Sambungan Python?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!