【问题标题】:Platform independent way to find path to libpython (e.g., for use in cmake)查找 libpython 路径的平台无关方式(例如,用于 cmake)
【发布时间】:2017-09-23 22:46:54
【问题描述】:

是否有任何独立于平台的方法来获取 python 安装的 libpython 的路径,以用作 cmake 参数? sysconfig.get_config_var 给出了一些片段,但我没有一致的方法可以让它工作。

在 OSX 上:

  • 没有变量包含库的实际基本名称 (libpython2.7.dylib)
  • sysconfig.get_config_var('LIBDIR') 返回 libpython2.7.dylib 所在目录 (/usr/local/opt/python/Frameworks/Python.framework/Versions/2.7/lib)
  • 编辑:sysconfig 报告符号链接和报告真实路径时似乎存在一些差异。 LIBDIR 实际上包含 libpython.2.7.dylib,但我刚刚注意到这是 /usr/local/Cellar/python/2.7.13_1/Frameworks/Python.framework/Versions/2.7/Python 的符号链接。

    INSTSONAME 指向 Python.framework/Versions/2.7/Python,该路径的基本名称,但我找不到指向该路径父部分的变量。

在 Ubuntu 上:

  • sysconfig.get_config_var('INSTSONAME') 给了我库的名称 (libpython2.7.so.1.0)。
  • 没有变量包含它所在的目录 (/usr/lib/x86_64-linux-gnu/)。
    • LIBDIR 只返回 /usr/lib

【问题讨论】:

    标签: python cmake


    【解决方案1】:

    CMake python 模块:FindPythonLibsFindPythonInterp

    如果这些对你不起作用,只需在调用 cmake -DPYTHON_EXECUTABLE:FILEPATH-DPYTHON_LIBRARY:FILEPATH-DPYTHON_INCLUDE_DIR:FILEPAT 时设置下一个变量,更多信息请查看 here

    例子:

    cmake .. -G "Sublime Text 2 - Ninja"
    -DCMAKE_BUILD_TYPE=Release
    -DPYTHON_EXECUTABLE:FILEPATH=d:\virtualenvs\python362_32
    -DPYTHON_LIBRARY:FILEPATH=d:\virtualenvs\python362_32\libs\python36.lib
    -DPYTHON_INCLUDE_DIR:FILEPAT=d:\virtualenvs\python362_32\include
    

    【讨论】:

    • 我开始尝试自己指定这些,因为 FindPythonLibs 似乎无法自行找到正确的库。 ~~但是现在实际上进行了更多的实验,如果我同时指定python的路径和python包含目录,但将库的路径保留在外面,似乎会做得更好~~不,从头开始,似乎只是一个缓存的东西.它正在查找 OSX 附带的 python 安装,而不是我使用 homebrew 安装的版本。
    • @Alec 我明白了...老实说,我尽量避免(作为黄金法则)使用系统范围的 python 包!否则,我所有的 swig 模块都倾向于在构建过程中使用特定的 virtualenvs (include+libs)。我只需要在 cmake 命令行上指定它。这样做我的生活会轻松得多:)。出于好奇,您有什么充分的理由使用 system-python 发行版?
    • 我不确定你的意思;我不是在尝试使用系统范围的 python 包,而是在尝试为库构建一个轮子来分发。我尝试从 virtualenv 中运行 cmake,但这仍然没有让 cmake 找到正确版本的 libpython。
    • 另外:我知道我可以通过 -DPYTHON_LIBRARY 指定 libpython 的路径。我要做的是以编程方式确定要使用的 libpython 的正确版本(即:与 python 安装 cmake 一起使用的版本)。
    • 你在运行 cmake 之前激活 virtualenv 吗?如果是这样,则 virtualenv 信息将在 os.environ 中可用。如果没有,您首先需要以某种方式指定要使用的虚拟环境。例如,我为 sublime 编写了一个插件,它允许我收集某个项目 (os.walk) 中的所有可用内容以及来自某些搜索目录的内容。无论如何,我对您现在面临的问题有点困惑,抱歉我的回答没有帮助
    猜你喜欢
    • 2014-07-11
    • 2011-04-02
    • 2012-02-23
    • 2018-12-13
    • 2019-08-11
    • 2020-10-03
    • 2011-03-20
    • 2021-04-03
    • 1970-01-01
    相关资源
    最近更新 更多