初始情况:
我有一个 C/C++ 库并为不同的目标语言提供绑定。其中一种语言是 Python。我决定使用 Swig,因为它为许多语言提供了良好的支持,并且它与 CMake 的集成非常简单。
为了提高 Python 绑定及其安装的可用性,我想提供一个 setup.py。这个想法是从 setup.py 文件中运行 CMake,因为 CMake 包含如何正确创建绑定的所有逻辑。
我目前得到的:
我能够运行 CMake 并从 setup.py 中构建 Python 绑定的目标。
根据 Swig 的设计,CMake 文件需要区分 Python 2 和 Python 3。在运行 CMake 时,它会检测 Python 安装的位置并配置环境。如果用户同时安装了 Python 2 和 Python 3(及其开发包),CMake 始终采用 Python 3。
根据:https : //cmake.org/cmake/help/v3.0/module/FindPythonLibs.html 可以通过设置 PYTHON_LIBRARY 和 PYTHON_INCLUDE_DIR 来指定实际使用的 Python 版本。例如我必须运行:
cmake -DPYTHON_INCLUDE_DIR=/usr/include/python2.7 -DPYTHON_LIBRARY=/usr/lib/x86_64-linux-gnu/libpython2.7.so
Run Code Online (Sandbox Code Playgroud)
问题是什么:
如果用户执行:
python setup.py build
Run Code Online (Sandbox Code Playgroud)
可执行文件“python”的 Python 版本可能是 2,但 CMake 使用版本 3 构建绑定(见上文)。
根据从 python 中查找 python 头路径?我可以使用以下方法获取头文件的位置: …
我看到那INCLUDE
条路是sysconfig.get_path('include')
。
但我看不到有任何类似的价值LIB
。
NumPy 直接像os.path.join(sys.prefix, "libs")
Windows中那样对其进行硬编码,否则(在Windows中get_config_var('LIBDIR')
没有记录和丢失)。
还有更多受支持的方法吗?