2016-10-06 9 views
0

나는 이와 같은 간단한 테스트 예를 가지고 :파이썬 테스트로 테스트 할 수있는 도달 가능한 위치에 swig 래퍼를 두는 방법은 무엇입니까?

enter image description here

을 그리고 내 CMakeLists.txt은 다음과 같습니다 : 나는거야 래퍼를 ST 파일을 생성하고 구축 후

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}) 

빌드 디렉토리에이 출력 :

enter image description here

문제는 여기에 내 테스트 runme.py 해당 라이브러리를로드 할 수 없습니다. 그래서, 내 질문은 어떻게 example.pyexample.pyd (그 중 하나만) 제대로 테스트 할 수있는 장소에 있어야합니까? 나는 CMakeLists.txt set(CMAKE_SWIG_OUTDIR ${CMAKE_CURRENT_BINARY_DIR}/..)이 줄을 추가 시도했는데 결과는 평 혼자 생성 된 래퍼를 배치했다 :

enter image description here

그리고 빌드 폴더에 남아으로 .pyd :

enter image description here

그래서 파이썬 테스트 파일로 테스트 할 수있는 래퍼를 어떻게 연결할 수 있습니까?

답변

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를 사용하지 않고 가져 오기를 수행 할 수 있습니다.

+0

물론, 알고 있습니다.어쨌든, CMake를 호출 할 때 __init__ 파일을 생성하는 방법을 알고 있습니까? 나는 CMake 밖에서 어떤 커스텀 커맨드 (touch __init__.py)도 타이핑하는 것을 피하고 싶다 : CMake만으로 완벽하게 구동되는 프로세스 – BPL

+0

미리 빌드 폴더가 없다는 것을 알지 못해 죄송합니다. 나는 내 대답을 편집하여 runme.py 파일에서 가져 오기를해야하는 파일을 생성 했으므로 CMake 나 외부에서 개입하지 않아도된다. –

0

단위 테스트에는 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 테스트 스크립트에서 경로를 추가 할 수도 있지만 임의의 빌드 위치를 지원하는 것이 좋습니다.