トックのCG部屋-トップ別室へ

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
  1. --/--/--(--) --:--:--|
  2. スポンサー広告

プログラミングメモ(Python3.xをC++プログラムに組み込む~その1~)

Python3.xのインタプリタを自分のプログラムに組み込む(埋め込む)にはどうするかというお話
いつもの最低限系技術メモ

Python3を組み込む話
↑重要

言語処理系の授業の自由発表課題でPythonの話でもするかと思ったはいいものの
Python3についてはほとんど日本語資料が出てこなくて困った
2.x系とほとんど変わらないところもあるけど違うところもあって
結局英語ドキュメント見ながら関数とクラスを追加してみた
その備忘録的なもの

ちなみに導入部分はWindows+VisualStudio環境
それ以降は関係ないはず

組み込みっていうか埋め込みって言ったほうがいいのかなぁ
でもどっちもenbeddingだしいいかとかも思ったり

で,気力が持たないから中身がそこそこあるから何回かに記事を分けるよ

今回の内容
・Pythonの準備
・C++プログラムからPythonインタプリタでHello world

2013/03/26一部修正

本編はいつも通り追記で

Pythonの準備


まずは環境を整えよう
ということでPythonを落としてくるんだけど
ここはソースコードを落としてきましょう
というのもこういうのってバイナリ落としてきても大抵うまくいかないから
必要な物は揃ってるはずなんだけどなんかうまく行かなかった気がする
まぁ自分でビルドしたほうが確実だよ,うん
てなわけでまずはビルドから

Pythonの公式からDOWNLOADにいって
ソース(Python 3.x.x compressed source tarball)を落としてくる
for Linux以下略とか書いてあるけど気にしない
ちゃんとVisualStudioのソリューション入ってるし

で,落としてきたら解凍

解凍したフォルダから
Python-3.x.x\PCbuild\pcbuild.sln
のソリューションファイルを開く
ちなみにこれはその時の最新……かはわからないけどVisualStudio用だから
旧バージョン使ってる人はPython-3.x.x\PCから
適切なバージョンのソリューションを探して使ってね

開いたら太字になってるプロジェクト"python"をReleaseとDebugでビルド
----2013/03/26修正----
まぁデバッグ用のバイナリなんて(゚⊿゚)イラネって人はReleaseだけでもいいかもしれないけど
ヘッダーでlibのリンクも書かれてたからやっぱりデバッグ用のバイナリも必要だった
pyconfig.hの中を修正すればいい話でもあるけど
----修正ここまで----
ビルド


んでビルドしたらPCbuildに戻る
そうすると実行ファイルだったりlib,dllだったりができてる
更新日時でソートすると見つけやすいよ
ビルド後にできるファイル

この中で今回とりあえず必要なのは
・python3x.dll(xは番号)
・python3x.lib
・python3x_d.dll(これと下はDebugビルドしたとき)
・python3x_d.lib
の4つ

一応これでビルドは完了したけど
使うファイルだけ別なところに置いておこう
パス通したりしなきゃいけないからね

まぁどこでもいいんだけど普段外部ライブラリ置いてるディレクトリに
python3xとかディレクトリ作って,その中にさらにbin,include,libを作る
libの中に.lib,binの中に.dllを入れる
あと必要なのはPython-3.x.xの中にあるIncludeとLib
Includeはそのまま中身を全部includeにいれて
Libはフォルダごとbinにでも入れる

あと重要なのがpyconfig.h
これがPython-3.x.x\PCの中にあるからこれもincludeの中に入れてね

ちなみにLibを入れる先がlibじゃないのは
libはC++の静的リンクライブラリを入れておく場所で
Libの中身はPythonの標準ライブラリのようなものだから

そんなこんなで大体こんな感じになる
python3xの中身includeの中身
libの中身binの中身

まぁ別にどこに何置いてるか把握できてりゃどうなっててもいいんだけど

とりあえずこれで準備は完了


C++プログラムからPythonインタプリタでHello world


さてじゃあ実際にPythonを動かしてみようか
ということになるのだけど
とりあえず一番簡単なサンプルプログラム

Pythonのインタプリタを使ってPythonのコードでHello worldを出力する
#include <python.h>
int main(int argc, char **argv) {
Py_Initialize();
PyRun_SimpleString("print('hello world')");
Py_Finalize();
return 0;
}

・Py_Initialize():Pythonの初期化
・PyRun_SimpleString():文字列で渡したPythonのコードを実行する
・Py_Finalize():終了処理
という内容

で,ビルドの設定だけど
インクルードパスにさっきのinclude
ライブラリパスにさっきのlib(.libファイルが入ってる方)
を追加
----2013/03/26修正----
あとリンカー→入力→追加の依存ファイルか
pragmaでpython3x.lib(デバッグビルドならpython3x_d.lib)をリンク

リンクの設定はpyconfig.hに書いてあるから必要なかった
むしろここでデバッグビルドなのにリリース用バイナリとか指定するとおかしなことになる
----修正ここまで----

まぁこのへんは他のライブラリと一緒

ビルドしたら
実行ファイルがあるフォルダ
python3x.dll(python3x_d.dll)と
binの中に入れたLib(Pythonの標準ライブラリ)

を入れる

dllを置くのはやっぱり普通だけど
Pythonの場合はPythonの標準ライブラリも一緒に置いておかなきゃいけない
実際のところ実行ファイルのある場所じゃなくても
パスさえ通ってればいいのかもしれないけど
まぁ上の通りにやるのが確実だと思う

実行すると次の通り
helloworld実行

めでたしめでたし

まぁ正直ここまでは特にできたところでうまみもないから
次いつ書くかわからない関数やクラスの作り方が本番
更にいうとここまでは2.xまでと変わらなかったはず


以下どうでもいい話

自分の中では
ゲームに埋め込むスクリプトとして使ってみようかなぁ
というモチベーションでやってはいるものの
本当にこれを使うかどうかは決めかねているという感じ

というかBlenderの影響で3を使ってるけど
世間的にまだまだ2の方が優勢っぽくてなんか複雑
  1. 2013/03/20(水) 12:24:14|
  2. 雑記
  3. | トラックバック:0
  4. | コメント:0
<<戦艦の進捗 | ホーム | プログラミングメモ(GLSL環境導入)>>

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバックURLはこちら
http://took.blog72.fc2.com/tb.php/795-98a2d752
この記事にトラックバックする(FC2ブログユーザー)

プロフィール

Author:トック

プロフィール(仮)

twitter:elgraiv_took
└ブログ更新情報

twitter:elgraiv_take
└無駄な日常つぶやき用

FC2カウンター

コンテンツ一覧

本棚

最近の記事

カテゴリー

月別アーカイブ

ブログ内検索

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。