CMAKE를 사용하여 Python Site-Packages 디렉토리 찾기
문제
CMAKE를 사용하여 응용 프로그램을 작성합니다. Python Site-Packages 디렉토리가 위치한 위치를 어떻게 찾을 수 있습니까? 파이썬으로 확장을 컴파일하려면 경로가 필요합니다.
Cmake는 Linux, Mac 및 Windows에 응용 프로그램을 배포 할 계획이므로 세 가지 주요 OS에서 경로를 찾을 수 있어야합니다.
나는 사용을 시도했다
include(FindPythonLibs)
find_path( PYTHON_SITE_PACKAGES site-packages ${PYTHON_INCLUDE_PATH}/.. )
그러나 그것은 작동하지 않습니다.
실행을 통해 길을 얻을 수도 있습니다
python -c "from distutils.sysconfig import get_python_lib; print get_python_lib()"
쉘에서는 CMAKE에서 어떻게 호출할까요?
해결책:
고마워요, 알렉스. 따라서 사이트 패키지 DIR을 제공하는 명령은 다음과 같습니다.
execute_process ( COMMAND python -c "from distutils.sysconfig import get_python_lib; print get_python_lib()" OUTPUT_VARIABLE PYTHON_SITE_PACKAGES OUTPUT_STRIP_TRAILING_WHITESPACE)
후행 새 라인을 제거하려면 output_strip_trailing_whitespace 명령이 필요합니다.
해결책
CMAKE에서 외부 프로세스를 실행할 수 있습니다 execute_process (필요한 경우 여기에있는 것처럼 출력을 변수로 가져옵니다).
다른 팁
내가 사용한 약간 업데이트 된 버전 LCM:
execute_process(
COMMAND "${PYTHON_EXECUTABLE}" -c "if True:
from distutils import sysconfig as sc
print(sc.get_python_lib(prefix='', plat_specific=True))"
OUTPUT_VARIABLE PYTHON_SITE
OUTPUT_STRIP_TRAILING_WHITESPACE)
이것은 세트입니다 PYTHON_SITE
적절한 접두사 관계 경로로 사용하기에 적합합니다.
install(
FILES ${mypackage_python_files}
DESTINATION ${PYTHON_SITE}/mypackage)
(절대 경로에 설치하지 마십시오! 그렇게하는 것은 바이 패스입니다. CMAKE_INSTALL_PREFIX
.)
CMAKE 3.12이므로 사용할 수 있습니다 findpython 채워진 모듈 Python_SITELIB
그리고 Python_SITEARCH
아키텍처 독립 및 특정 라이브러리의 변수.
예시:
find_package(Python ${PYTHON_VERSION} REQUIRED COMPONENTS Development)
Python_add_library(foo MODULE
src/foo.cc src/python_interface.cc
)
install(TARGETS foo DESTINATION ${Python_SITEARCH}/foo)
사용하는 것이 좋습니다 get_python_lib(True)
이 확장을 동적 라이브러리로 만드는 경우. 이 첫 번째 매개 변수는 플랫폼 특정 위치가 필요한 경우 (64 비트 리눅스 머신에서) /usr/lib64
대신에 /usr/lib
)