2016-10-06 1 views
0

я получил простой пример теста, как этот:Как положить обертки Swig в доступное место для тестирования с помощью тестов python?

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.py и example.pyd (только те, которые находятся) в подходящем месте для правильной проверки? Я попытался добавить эту строку в CMakeLists.txt set(CMAKE_SWIG_OUTDIR ${CMAKE_CURRENT_BINARY_DIR}/..) и результат размещения .py и сгенерированные упаковщики в одиночку:

enter image description here

И оставаясь в папке построить .pyd:

enter image description here

Итак, как я могу поместить обертки в доступное место для тестирования моими тестовыми файлами python?

ответ

0

Я предполагаю, что вы хотите импортировать библиотеки в свой файл runme.py. Чтобы импортировать файлы python в подкаталог, этот подкаталог нуждается в файле __init__.py. Вы можете поместить пустую в свою папку сборки. Это должно позволить вашей программе импортировать файлы.

Вы могли бы использовать:

import build.example 
import build._example 

Таким образом, это не имеет значения, если файлы не находятся в том же каталоге, при условии, что не существует еще одна причина, вы хотите их там.

Edit:

Поскольку папка сборки не существует заранее, вы всегда можете создать и скомпилировать файл __init__.py в runme.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.

+0

Конечно, я знаю об этом.В любом случае, знаете ли вы, как сгенерировать файл __init__ при вызове CMake? Я бы предпочел не вводить какую-либо пользовательскую команду (коснитесь __init__.py) вне CMake, то есть: процесс отлично управляется только CMake – BPL

+0

Извините, я не знал, что раньше у вас не было папки сборки. Я отредактировал свой ответ, чтобы создать файл, необходимый для импорта из файла runme.py, поэтому он не должен требовать, чтобы что-либо было сделано в CMake или любом внешнем вмешательстве. –

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, но часто желательно поддерживать произвольное местоположение сборки.

Смежные вопросы