CMakeのでPythonのsite-packagesディレクトリを検索
質問
私は自分のアプリケーションを構築するためにCMakeのを使用しています。どのように私はPythonのsite-packagesディレクトリが配置されている場所を見つけることができますか?私は、Pythonの拡張機能をコンパイルするためにパスを必要としています。
CMakeのは、私は、Linux、MacとWindows上で自分のアプリケーションを展開することを計画してすべての3つの主要な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のから呼び出すことでしょうか?
SOLUTIONます:
おかげで、アレックス。 だから、私のサイトのパッケージディレクトリを与えるコマンドがあります:
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コマンドは末尾の改行を削除するために必要とされます。
解決
あなたは execute_process (および必要に応じて、それはここだろうと、変数に出力を得る)。
他のヒント
少し更新されたバージョン
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以来、あなたはPython_SITELIB
を移入 FindPython のモジュールを使用することができますそれぞれ、アーキテクチャに依存しないと、特定のライブラリのための変数を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ビットLinuxマシンでは、これは代わりに/usr/lib64
の/usr/lib
することができる)