見出し画像

openFrameworksのアプリケーションをPythonのライブラリとして呼び出す実験

PythonからopenFrameworksの関数が呼び出せるようになったら,Python製のライブラリのパワーを最大限に使いつつクリエイティブコーディングできるのでは?という期待があった.

Pythonから空のoFを起動するところまでできたので,一旦メモとして記事にする.

参考

開発環境

Windows 10
Python 3.7 (Anaconda)
pybind11 2.4.3
openFrameworks v.0.10.1
Visual Studio 2017

pybind11はpipでインストールできる.

pip install pybind11

oFのプロジェクトを作成する

まず,oFのprojectGeneratorを起動し,oFのプロジェクトを作る.このとき,プロジェクト名はPythonからimportできる名前にしておく必要がある.ここでは`pybindtestOF`とする.

画像1

ソリューションの設定とインクルードファイル,ライブラリのパスの設定を行う

プロジェクトを作成したらVisual Studioを起動する.ソリューション構成をRelease,ソリューションプラットフォームをx64に変更しておく.

画像2

ソリューションエクスプローラーのpybindtestOFを右クリックし,プロパティを開く.

ここで[全般] -> [構成の種類]を「ダイナミック ライブラリ (.dll)」,[ターゲットの拡張子]を「.pyd」に変更する.

画像3

次に,pybind11のインクルードファイルと静的ライブラリのパスを設定する.

これらのファイルはPythonのコマンドがあるディレクトリのルートにあって,例えば自分の環境だと,

・インクルードファイル:C:\Users\<username>\Anaconda37\include
・静的ライブラリ:C:\Users\<username>\Anaconda37\libs

みたいな感じ.これら2つをそれぞれ[VC++ ディレクトリ] -> [インクルードディレクトリ]と[ライブラリ ディレクトリ]の一番後ろにセミコロン区切りで追加する.

画像4

最後に[リンカー] -> [入力] -> [追加の依存ファイル]にpython37.libを追加する.ここもセミコロン区切りにする.

画像5

設定が終わったらmain.cppを開き,下記のように書き換える.

#include <pybind11/pybind11.h>
#include "ofMain.h"
#include "ofApp.h"
using namespace::std;
void runOF(int width, int height, ofWindowMode mode){
	ofSetupOpenGL(width, height, mode);
	ofRunApp(new ofApp());
}
namespace py = pybind11;
PYBIND11_MODULE(pybindtestOF, m) {
	m.doc() = "pybind11 for oF";
	m.def("runOF", &runOF);
	py::enum_<ofWindowMode>(m, "ofWindowMode")
		.value("OF_WINDOW", OF_WINDOW)
		.value("OF_FULLSCREEN", OF_FULLSCREEN)
		.export_values();
}

書き換えたら[ビルド] -> [ソリューションのビルド]を実行する.

ビルドが正常に終了すると,pybindtestOF/binにpytestbindOF.pydというファイルが作成される.

画像6

最後に,ターミナルからこのディレクトリに移動し,下図のようにoFをPythonから起動できればOK.

画像7

おわりに

まだウインドウの表示しかできないが,PythonからopenFrameworksを呼び出すことができた.今後,描画の関数などの機能を追加していきたい.

今回はインクルードファイルのパスとかを手動で設定したけど,この辺をCMakeとかで簡単化できると良いような気がする.

いただいたサポートは主にクリエイターとしての活動費になります