我想为 CMake 编写一个 Python 包装器,但即使是最简单的包装也失败了:
#!/usr/bin/env python
import os
import sys
os.execvp("cmake", sys.argv) # or 'sys.argv[1:]', both fail
使用例如运行此 Python 脚本包含
./pycmake .
的目录中的 CMakeLists.txt
失败并显示:
CMake Error: Could not find CMAKE_ROOT !!!
CMake has most likely not been installed correctly.
Modules directory not found in
CMake Error: Error executing cmake::LoadCache(). Aborting.
在同一目录上运行
cmake .
可以正常工作。
我在拨打
os.execvp
电话时是否忘记了什么?或者 CMake 使用了某种在被 Python 包装时失败的机制?
正如文档所说:
无论哪种情况,子进程的参数都应以正在运行的命令的名称开头,但这不是强制执行的。
cmake
以及其他一些程序,要求第一个参数必须是其名称或可执行文件的路径。它正在幕后处理该参数,主要是初始化,这是因为当它得到其他东西时,它会大喊缺少 CMAKE_ROOT。因此,解决方案应该如下所示:
#!/usr/bin/env python
import os
import sys
os.execvp("cmake", ["cmake"] + sys.argv[1:])