4. C와 C++ 확장 빌드하기¶
CPython의 C 확장은 초기화 함수를 내보내는 공유 라이브러리입니다 (예를 들어, 리눅스는 .so
, 윈도우는 .pyd
).
To be importable, the shared library must be available on PYTHONPATH
,
and must be named after the module name, with an appropriate extension.
When using setuptools, the correct filename is generated automatically.
초기화 함수는 다음과 같은 서명을 갖습니다:
It returns either a fully initialized module, or a PyModuleDef
instance. See C 모듈 초기화 for details.
ASCII로만 이루어진 이름을 가진 모듈의 경우, 함수의 이름을 PyInit_<modulename>
이어야 합니다. 여기서 <modulename>
을 모듈의 이름으로 치환합니다. 다단계 초기화를 사용할 때 ASCII가 아닌 모듈 이름이 허용됩니다. 이 경우, 초기화 함수 이름은 PyInitU_<modulename>
이며 <modulename>
은 파이썬의 punycode 인코딩으로 인코딩되고 하이픈을 밑줄로 대체합니다. 파이썬에서:
def initfunc_name(name):
try:
suffix = b'_' + name.encode('ascii')
except UnicodeEncodeError:
suffix = b'U_' + name.encode('punycode').replace(b'-', b'_')
return b'PyInit' + suffix
여러 초기화 함수를 정의하여 단일 공유 라이브러리에서 여러 모듈을 내보낼 수 있습니다. 그러나, 이들을 임포트 하려면 심볼릭 링크나 사용자 정의 임포터를 사용해야 합니다. 기본적으로 파일 이름에 해당하는 함수만 발견되기 때문입니다. 자세한 내용은 PEP 489의 “한 라이브러리에 여러 모듈” 절을 참조하십시오.
4.1. Building C and C++ Extensions with setuptools¶
Python 3.12 and newer no longer come with distutils. Please refer to the
setuptools
documentation at
https://setuptools.readthedocs.io/en/latest/setuptools.html
to learn more about how build and distribute C/C++ extensions with setuptools.