python - 为 CTest 测试设置环境变量时遇到问题

标签 python cmake swig ctest

我的任务是为基于 C++ 的项目构建 Python 绑定(bind)(使用 swig)。该项目使用 cmake 进行构建,使用 ctest 进行测试,并且应该将绑定(bind)的构建和测试集成到其中。

我已经让构建工作并且测试在手动运行时工作,但我必须设置几个环境变量才能使它们工作,而且我在为自动化过程设置这些变量时遇到了问题。

我需要设置 LD_LIBRARY_PATH 和 PYTHONPATH。 PYTHONPATH 我可以通过在测试脚本中操纵 sys.path 来绕过,但是使用 LD_LIBRARY_PATH 很难做到这一点。到目前为止,我已将以下内容添加到测试目录中的 CMakelists.txt 中:

#Python wrapper testing

find_package(PythonInterp 3.5 REQUIRED)

if (NOT PYTHONINTERP_FOUND)
  message(STATUS "Python interpreter NOT found")
else(NOT PYTHONINTERP_FOUND)
  message(STATUS "Python interpreter found")
  ADD_TEST(NAME testPyMyproj
       COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/test_scripts/test_pyMyproj.py
       )
  set_property(TEST testPyMyproj PROPERTY ENVIRONMENT LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/lib/)
endif (NOT PYTHONINTERP_FOUND)

我得到的错误是

ImportError: libMyproj.so: cannot open shared object file: No such file or directory

我的绑定(bind)链接到哪个库,它位于 ${CMAKE_BINARY_DIR}/lib/ 指定的目录中。

我认为这意味着 $LD_LIBRARY_PATH 设置不正确,但我不知道我做错了什么。

有没有办法在测试中检查变量的状态?谁能发现我做错了什么?

最佳答案

您可以使用 cmake -E env 命令将环境变量设置为调用测试的一部分。您可以将 add_test() 调用修改为如下所示:

ADD_TEST(NAME testPyMyproj
    COMMAND ${CMAKE_COMMAND} -E env
        LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/lib:$ENV{LD_LIBRARY_PATH}
        ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/test_scripts/test_pyMyproj.py
)

上面假设一个基于 Unix 的主机环境,但如果需要的话,您可以通过一些工作将其概括为支持所有平台/生成器类型。

另一种选择是使用 ENVIRONMENT应该实现基本相同的测试属性:

set_tests_properties(testPyMyproj PROPERTIES
    ENVIRONMENT LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/lib:$ENV{LD_LIBRARY_PATH})

关于python - 为 CTest 测试设置环境变量时遇到问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48954920/

相关文章:

python - 如何使用 python beautifulsoup 向 html 文件插入新行

CMake 和 FindProtobuf

c++ - 使用命名空间别名编译 opencv

python - 如何通过 SWIG 在 Python 和 C 之间编码指向 cstring 的指针

java - swig从struct中的变量获取返回类型作为java中的字符串数组

java - 命名空间问题

python - 使用批处理文件运行 Django 项目后 Chrome 无法打开

python - SVM分类任务中word2vec特征的输入格式是什么?

python - 用空格填充多个字符 - python

cmake - 指定 CTestTestfile.cmake 的目标