- ベストアンサー
pythonを使うときのビルド方法
C++(C)からPythonスクリプトを使う場合、 逆にPythoスクリプトからC++(C)の関数を呼び出す場合の C++(C)のビルド方法を教えてください。 (プログラミングではなくてビルド方法です) 環境は Visual Studio 2005 です。 Boost::pythonは使わない方法でお願いします。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
えーと、まずビルドの手順。 例示したURLから辿れるところで 4.3 DLL 使用の実際 に Windows で DLL を作成する際は、pythonXY.lib をリンカに渡さねばなりません。 例えば二つの DLL 、spam と ni (spam の中には C 関数が入っているとします) をビルドするには、以下のコマンドを実行します: cl /LD /I/python/include spam.c ../libs/pythonXY.lib cl /LD /I/python/include ni.c spam.lib ../libs/pythonXY.lib という記述があります。 実際にPythonインタプリタから importするには 作成したDLLモジュールの拡張子が .pyd でなければならない ことに注意してください。 あるいは#1の補足をみると自力でたどり着いているかもしれませんが、 ソースツリーの PC\example_nt というディレクトリに(2003用ですが) 2006/05/30 06:58 340 example.c 2004/12/29 23:15 882 example.sln 2006/04/23 00:19 5,083 example.vcproj 2006/03/01 15:28 6,743 readme.txt というのがありますので、これを適当にいじるというのも ありでしょう(IDEを使いたいのなら)。 次に自分のC/C++プログラムからPythonインタプリタを 呼び出してスクリプトを実行させる場合ですが cl /MD /Ic:/python25/include myapp.c -o myapp.exe c:/python25/libs/python25.lib こんな感じになります。 スクリプトを読み込ませるのには PyRun_SimpleFile 等が使えます。 最後に補足にある内容についてですが 見つからないというエラーになっているのは すべてPython.hをincludeすれば解決できるはずです。 が、Python.hが見つからないというエラーにはなっていないようなので ひょっとしたらPython.hのあとに取り込んでいる #include "stdafx.h" でなにかつじつまの合わないマクロ定義があるのかもしれません。 拡張モジュールでMFCを使うときとかいうのを どこかで見たような記憶があるので、 何か調整がいるのかもしれません。 とりあえずPythonインタプリタには TCHAR の世界を 見せない方がいいと思うので、 #include "Python.h" int main(int argc, char* argv[]){ Py_Initialize(); PyRun_SimpleString("print 'Hello, Python'"); Py_Finalize(); return 0; } でやってみてはどうでしょう? まだエラーになりますか?
その他の回答 (1)
- sakusaker7
- ベストアンサー率62% (800/1280)
Python インタプリタの拡張と埋め込み http://www.python.jp/doc/release/ext/ext.html に必要十分な情報はあると思いますが、読んだ上での質問ですか? 一つ注意しないといけないのは、バイナリ配布されているPythonでは 使用しているコンパイラがVC++7.1(VS2003)ですので、 Pythonそのものも自分でコンパイルしたものを使う必要があるかもしれない ということです。
お礼
はい。 > 拡張モジュールのコンパイル方法は、モジュールの用途や > システムの設定方法に依存します; 詳細は後の章で説明します。 とありますが、どこで説明されているのか見つけられませんでした。
補足
環境を変えてVS2003で下記のコードをビルドしてみましたが error C3861: 'Py_Initialize': 識別子は、引数依存の照合を使用しても見つかりません。 error C3861: 'PyRun_SimpleString': 識別子は、引数依存の照合を使用しても見つかりません。 error C3861: 'Py_Finalize': 識別子は、引数依存の照合を使用しても見つかりません。 というエラーが発生します ----- HelloPython.cpp ----- #include "Python.h" #include "stdafx.h" int _tmain(int argc, _TCHAR* argv[]){ Py_Initialize(); PyRun_SimpleString("print 'Hello, Python'"); Py_Finalize(); return 0; }
お礼
回答ありがとうございます。 とりあえず、インクルードの順番を変えて #include "stdafx.h" #include "Python.h" とすると、ビルドして動くようになり、一歩前進できました。 次は、PyRun_SimpleFile() で発生する例外と格闘しております。