如何将swig包装器放在可通过python测试进行测试的可到达位置?

时间:2016-10-06 23:38:47

标签: python cmake swig

我得到了一个简单的测试示例,如下所示:

enter image description here

我的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文件并构建包装器后,我将在构建目录中获取此输出:

enter image description here

问题在于我的测试runme.py无法加载这些库。所以,我的问题是,如何将example.pyexample.pyd(只有那些)置于可到达的地方进行正确测试?我已经尝试将此行添加到CMakeLists.txt set(CMAKE_SWIG_OUTDIR ${CMAKE_CURRENT_BINARY_DIR}/..),结果是单独放置.py和生成的包装器:

enter image description here

.pyd保留在构建文件夹中:

enter image description here

那么,我如何将包装器放在可以通过我的python测试文件进行测试的地方?

2 个答案:

答案 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测试脚本中添加路径,但通常需要支持任意构建位置。