【问题标题】:Where are include and libs when using a Python virtual environment?使用 Python 虚拟环境时包含和库在哪里?
【发布时间】:2018-01-27 01:30:47
【问题描述】:

我使用 Python 虚拟环境。基本上,它工作得很好,但是我在编译一些 Python 绑定时遇到了问题,即使用 libIGL 和 pybind11。

CMake 具有以下与 Python 相关的变量:

 PYTHON_EXECUTABLE                /users/me/libs/pyvenv/bin/python                           
 PYTHON_INCLUDE_DIR               /usr/include/python2.7                                          
 PYTHON_LIBRARY                   /usr/lib64/libpython2.7.so 

它似乎可以正确检测到之前激活的虚拟环境的可执行文件是python3.5,但是它发现包含和库的一些错误的2.7路径。

所以我想手动将这些路径设置为我的虚拟环境。我浏览了虚拟环境的目录结构,我想我在/users/me/libs/pyvenv/include/python3.5m 中找到了包含。但是我找不到libpython*,我的虚拟环境中根本没有*.so 文件。那么在这种情况下我应该使用哪个库?

【问题讨论】:

  • 显然,您应该使用正确的库!我相信您要查找的库应该与上面相同,将python2.7 替换为python3.5。顺便说一句,有一个可重现的例子会很好。您能否进一步解释一下“CMake 具有以下与 Python 相关的变量”? (这些环境变量是在脚本中设置的吗……等等)
  • @Adonis:据我了解,问题是关于使用find_package(PythonLibs) 检测 Python 库的现有项目(libIGL 和 pybind11)。所以这里不太可能需要代码。
  • Tsyvarev,是的,如果 CMake 能自动找到文件就好了。但这个问题可以理解得更基础,就像:“在虚拟环境中哪里可以找到“libpython”。”
  • 我不是 python 虚拟环境方面的专家,但我 python 库不依赖环境。环境将站点包确定为 python 脚本或库,但基本 python 库保持不变。所以,可能你需要在系统位置搜索库文件,比如/usr/lib64/
  • @Tsyvarev:虽然您提出的方法解决了问题,但我仍然觉得它非常不令人满意。虚拟环境的目的是在不关心底层系统的情况下提供对 Python 安装的访问。因此,直接以系统特定的路径访问库有点违反这一原则。只是我的 2 美分 ;-)

标签: python cmake virtualenv pybind11


【解决方案1】:

限制 python 库以匹配 cmake 中找到的解释器的版本:

find_package(PythonInterp REQUIRED)
find_package(PythonLibs "${PYTHON_VERSION_MAJOR}.${PYTHON_VERSION_MINOR}" REQUIRED )

如果 cmake>=3.12 可用,则使用 FindPython

【讨论】:

    【解决方案2】:

    this question 类似,您可以在virtualenv 中运行python 并运行

    import pybind11
    print(pybind11.__file__)
    # '/home/me/.pyenv/versions/py36/lib/python3.6/site-packages/pybind11/__init__.py'
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-06-13
      • 2020-10-01
      • 1970-01-01
      • 2021-12-10
      • 2022-10-07
      • 2018-11-12
      • 1970-01-01
      相关资源
      最近更新 更多