我得到了一个简单的测试示例,如下所示:
我的CMakeLists.txt看起来像这样:
cmake_minimum_required(VERSION 3.7)
FIND_PACKAGE(SWIG REQUIRED)
INCLUDE(${SWIG_USE_FILE})
FIND_PACKAGE(PythonLibs)
INCLUDE_DIRECTORIES(${PYTHON_INCLUDE_PATH})
INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR})
SET(CMAKE_SWIG_FLAGS "")
SET_SOURCE_FILES_PROPERTIES(example.i PROPERTIES CPLUSPLUS ON)
set(SWIG_MODULE_example_EXTRA_DEPS example.cxx example.h)
SWIG_ADD_MODULE(example python example.i example.cxx)
SWIG_LINK_LIBRARIES(example ${PYTHON_LIBRARIES})
生成ST文件并构建包装器后,我将在构建目录中获取此输出:
问题在于我的测试runme.py
无法加载这些库。所以,我的问题是,如何将example.py
和example.pyd
(只有那些)置于可到达的地方进行正确测试?我已经尝试将此行添加到CMakeLists.txt set(CMAKE_SWIG_OUTDIR ${CMAKE_CURRENT_BINARY_DIR}/..)
,结果是单独放置.py和生成的包装器:
.pyd保留在构建文件夹中:
那么,我如何将包装器放在可以通过我的python测试文件进行测试的地方?
答案 0 :(得分:0)
我假设您要将库导入runme.py。为了在子目录中导入python文件,该子目录中需要一个__init__.py文件。您可以将空的一个放入构建文件夹中。这应该允许您的程序导入文件。
然后你可以使用:
import build.example
import build._example
这样,如果文件不在同一目录中就不重要了,假设你没有其他原因。
编辑:
由于构建文件夹没有提前存在,您可以通过执行以下操作来创建和编译runme.py文件中的__init__.py文件:
import os
import py_compile
dir_path = os.path.dirname(os.path.realpath(__file__))
open(dir_path + os.sep + "build" + os.sep + "__init__.py", "w+")
py_compile.compile(dir_path + os.sep + "build" + os.sep + "__init__.py")
py_compile.compile(dir_path + os.sep + "build" + os.sep + "example.py")
import build.example
import build._example
这将创建您需要的文件,然后可以在不使用CMake的情况下进行导入。
答案 1 :(得分:0)
我使用C ++进行单元测试,使用Python进行参考实现或集成测试。
我使用的方法是添加一个自定义目标,它将库以及任何额外生成的文件复制到我的源目录,python测试文件位于该目录中。我已经配置了我的.gitignore
文件,以至于它们永远不会被错误地添加到我的存储库中。
add_custom_target(copy ALL)
# Some library my Swig wrapped library depends on (say gl)
add_custom_command(TARGET copy
PRE_BUILD
COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_FILE:gl> ${CMAKE_CURRENT_SOURCE_DIR}
DEPENDS $<TARGET_FILE:gl>)
# The Swig library, say swig_example (Note the _ in the target name)
add_custom_command(TARGET copy
PRE_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_if_different $<TARGET_FILE:_swig_example> ${CMAKE_CURRENT_SOURCE_DIR}
DEPENDS $<TARGET_FILE:_swig_example>)
# The extra .py files generated by SWIG
add_custom_command(TARGET copy
PRE_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_if_different ${swig_extra_generated_files} ${CMAKE_CURRENT_SOURCE_DIR}
DEPENDS $<TARGET_FILE:_swig_example>)
enable_testing()
add_test(
NAME "${CMAKE_CURRENT_SOURCE_DIR}/some_test.py"
COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/some_test.py
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
我相信这是一个非常简洁的设置。或者,您可以开始在Python测试脚本中添加路径,但通常需要支持任意构建位置。