![見出し画像](https://assets.st-note.com/production/uploads/images/15422136/rectangle_large_type_2_a6aa0deeb3cc31250eccbeda43d7b40b.png?width=1200)
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`とする.
ソリューションの設定とインクルードファイル,ライブラリのパスの設定を行う
プロジェクトを作成したらVisual Studioを起動する.ソリューション構成をRelease,ソリューションプラットフォームをx64に変更しておく.
ソリューションエクスプローラーのpybindtestOFを右クリックし,プロパティを開く.
ここで[全般] -> [構成の種類]を「ダイナミック ライブラリ (.dll)」,[ターゲットの拡張子]を「.pyd」に変更する.
次に,pybind11のインクルードファイルと静的ライブラリのパスを設定する.
これらのファイルはPythonのコマンドがあるディレクトリのルートにあって,例えば自分の環境だと,
・インクルードファイル:C:\Users\<username>\Anaconda37\include
・静的ライブラリ:C:\Users\<username>\Anaconda37\libs
みたいな感じ.これら2つをそれぞれ[VC++ ディレクトリ] -> [インクルードディレクトリ]と[ライブラリ ディレクトリ]の一番後ろにセミコロン区切りで追加する.
最後に[リンカー] -> [入力] -> [追加の依存ファイル]にpython37.libを追加する.ここもセミコロン区切りにする.
設定が終わったら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というファイルが作成される.
最後に,ターミナルからこのディレクトリに移動し,下図のようにoFをPythonから起動できればOK.
おわりに
まだウインドウの表示しかできないが,PythonからopenFrameworksを呼び出すことができた.今後,描画の関数などの機能を追加していきたい.
今回はインクルードファイルのパスとかを手動で設定したけど,この辺をCMakeとかで簡単化できると良いような気がする.
いいなと思ったら応援しよう!
![eqs](https://assets.st-note.com/production/uploads/images/15210375/profile_95039c1e9d75dbc7f3d85ff4fccf47aa.png?width=600&crop=1:1,smart)