2016-10-06 38 views
0

私はこの1つのような簡単なテスト例を得た:Pythonテストでテストできる到達可能な場所に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}/..)に次の行を追加しようとしたとの結果だけでの.pyと生成されたラッパーを配置した

enter image description here

そしてビルドフォルダに残っている.pyd:

enter image description here

私はどのように私のpythonテストファイルでテストするために到達可能な場所にラッパーを置くことができますか?

答えて

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

私は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のテストスクリプトでパスを追加することもできますが、任意のビルド場所をサポートすることがしばしば望まれます。

関連する問題