Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 设置CTest测试的环境变量时出现问题_Python_Cmake_Swig_Ctest - Fatal编程技术网

Python 设置CTest测试的环境变量时出现问题

Python 设置CTest测试的环境变量时出现问题,python,cmake,swig,ctest,Python,Cmake,Swig,Ctest,我的任务是为基于c++的项目(使用swig)构建python绑定。该项目使用cmake进行构建,使用ctest进行测试,绑定的构建和测试应该集成到该项目中 我已经让构建工作起来了,测试在手动运行时也能工作,但是我必须设置几个环境变量才能让它们工作,而我在为自动化过程设置这些变量时遇到了麻烦 我需要设置LD_LIBRARY_路径和PYTHONPATH。PYTHONPATH我可以通过在测试脚本中操纵sys.path来解决问题,但使用LD_LIBRARY_path则更难做到这一点。到目前为止,我已将以

我的任务是为基于c++的项目(使用swig)构建python绑定。该项目使用cmake进行构建,使用ctest进行测试,绑定的构建和测试应该集成到该项目中

我已经让构建工作起来了,测试在手动运行时也能工作,但是我必须设置几个环境变量才能让它们工作,而我在为自动化过程设置这些变量时遇到了麻烦

我需要设置LD_LIBRARY_路径和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
我的绑定链接到哪个库,并且位于
${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)