Python 设置CTest测试的环境变量时出现问题
我的任务是为基于c++的项目(使用swig)构建python绑定。该项目使用cmake进行构建,使用ctest进行测试,绑定的构建和测试应该集成到该项目中 我已经让构建工作起来了,测试在手动运行时也能工作,但是我必须设置几个环境变量才能让它们工作,而我在为自动化过程设置这些变量时遇到了麻烦 我需要设置LD_LIBRARY_路径和PYTHONPATH。PYTHONPATH我可以通过在测试脚本中操纵sys.path来解决问题,但使用LD_LIBRARY_path则更难做到这一点。到目前为止,我已将以下内容添加到测试目录中的CMakelists.txt中:Python 设置CTest测试的环境变量时出现问题,python,cmake,swig,ctest,Python,Cmake,Swig,Ctest,我的任务是为基于c++的项目(使用swig)构建python绑定。该项目使用cmake进行构建,使用ctest进行测试,绑定的构建和测试应该集成到该项目中 我已经让构建工作起来了,测试在手动运行时也能工作,但是我必须设置几个环境变量才能让它们工作,而我在为自动化过程设置这些变量时遇到了麻烦 我需要设置LD_LIBRARY_路径和PYTHONPATH。PYTHONPATH我可以通过在测试脚本中操纵sys.path来解决问题,但使用LD_LIBRARY_path则更难做到这一点。到目前为止,我已将以
#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
我的绑定链接到哪个库,并且位于${CMAKE\u BINARY\u DIR}/lib/
指定的目录中
我认为这意味着$LD\u LIBRARY\u 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的主机环境,但是如果需要,您可以将其推广到支持所有平台/生成器类型,只需做一点工作
另一种选择是使用测试属性,该属性应实现基本相同的功能:
set_tests_properties(testPyMyproj PROPERTIES
ENVIRONMENT LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/lib:$ENV{LD_LIBRARY_PATH})
Craig Scott已经通过环境测试属性提供了一个很好的解决方案。我只想添加如何在Windows上使用Visual Studio生成器和生成器表达式:
set_tests_properties(
name_of_test_one
name_of_test_two
PROPERTIES
# Make sure DLL is found by adding its directory to PATH
ENVIRONMENT "PATH=$<TARGET_FILE_DIR:library_target_name>\;$ENV{PATH}"
)
设置测试属性(
测试一的名称
测试二的名称
性质
#通过将其目录添加到路径,确保找到DLL
环境“路径=$\;$ENV{PATH}”
)
注1:使用转义分号代替冒号
注2:我正在使用更灵活的$generator表达式谢谢。因为我怀疑这个变量是空的。它没有解决我做错的主要问题。我不知道你想做什么<代码>我需要设置LD_LIBRARY_路径和PYTHONPATH。PYTHONPATH我可以通过…来解决这个问题,你就不能设置envvars吗?我可以手动设置它们,然后它就可以工作了,但这需要在docker容器中自动运行。我试图以一种不依赖于系统预先存在的状态的方式来设置它们。为什么不使用
os.environ[“LD_LIBRARY_PATH”]=“foo”
?请注意,对于使用多个变量的ENVIRONMENT
属性,必须将它们作为一个分号分隔的字符串。另请参见:set_属性(TEST[…]追加属性环境[value1…])
如果您需要在变量值中使用分号(例如Windows上的路径),请使用类似\\$
的方法使用多个值的示例:set\u属性(测试单元\u测试属性环境LD\u库\u路径=“$ENV{LD\u库\u路径”\\$opt/poky/1.4.2/sysroot/core2 poky linux/lib)