PythonとCは相互に呼び出し、コンパイルします.
6445 ワード
最近Boostを勉強しています.pythonのために、違う言語の間の相互コンパイルを試してみたいです.
参考資料:http://blog.csdn.net/joliny/article/details/2457197.
驚いたことに、パソコンにpyton t 2.7とvs 2010がインストールされていますが、他のAPIやコンパイラをインストールする必要がなく、直接にcプログラムでPythonを呼び出すことができます.
まず試したのはVS IDEでコンパイルしましたが、ネットでインストールされているpythonはrelease版で、コンパイルにはいつも問題があります.だからまた第二の方法に変えて、dos命令の下で.
最初の方法は大丈夫だと思いますが、時間がないので、続けられませんでした.後で時間があれば試してみたいです.
知識の準備
1.Dosでコンパイルコマンドclパラメータ詳細
一、Cプログラムでpythonを呼び出します.
まず、環境変数にpythonを追加するパスが必要です.これは通常のシステム環境変数パスに追加されています.(試してみましたが、失敗しました.パスの下にデフォルトで追加されたのは全部bin実行プログラムですか?)とは違います.
システム環境変数には2つの変数INCLUDEとLIBが追加され、それぞれpythonディレクトリ下のincludeとlibsに対応しています.
その後、プログラムをテストします.
二、C言語を利用してPythonダイナミックリンクを生成する.
前にVS IDEでdllファイルを作成しましたが、今度はdosウィンドウの下でテストしました.
ファイルfoo.
三、次はBoost.Pythonに連絡する実験です.
参考資料:http://blog.csdn.net/joliny/article/details/2457197.
驚いたことに、パソコンにpyton t 2.7とvs 2010がインストールされていますが、他のAPIやコンパイラをインストールする必要がなく、直接にcプログラムでPythonを呼び出すことができます.
まず試したのはVS IDEでコンパイルしましたが、ネットでインストールされているpythonはrelease版で、コンパイルにはいつも問題があります.だからまた第二の方法に変えて、dos命令の下で.
最初の方法は大丈夫だと思いますが、時間がないので、続けられませんでした.後で時間があれば試してみたいです.
知識の準備
1.Dosでコンパイルコマンドclパラメータ詳細
C/C++
- -
/O1 /Op[-]
/O2 /Os
/Oa /Ot
/Ob<n> ( n=0) /Ow
/Od ( ) /Ox 。(/Ogityb2 /Gs)
/Og /Oy[-]
/Oi
- -
/G3 80386 /Gh _penter
/G4 80486 /GH _pexit
/G5 Pentium /GR[-] C++ RTTI
/G6 PPro、P-II、P-III /GX[-] C++ EH ( /EHsc )
/G7 Pentium 4 Athlon /EHs C++ EH ( SEH )
/GB ( ) /EHa C++ EH(w/ SEH )
/Gd __cdecl /EHc extern "C" nothrow
/Gr __fastcall /GT TLS
/Gz __stdcall /Gm[-]
/GA Windows /GL[-]
/Gf /QIfdiv[-] Pentium FDIV
/GF /QI0f[-] Pentium 0x0f
/Gy /QIfist[-] FIST ftol()
/GZ (/RTCs) /RTC1 (/RTCsu)
/Ge /RTCc
/Gs[num] /RTCs
/GS /RTCu
/clr[:noAssembly]
noAssembly -
/arch:<SSE|SSE2> CPU , :
SSE - SSE CPU
SSE2 - SSE2 CPU
- -
/Fa[file] /Fo<file>
/FA[sc] /Fp<file>
/Fd[file] .PDB /Fr[file]
/Fe<file> /FR[file] .SBR
/Fm[file]
- -
/AI<dir> /Fx
/FU<file> / /FI<file>
/C /U<name>
/D<name>{=|#}<text> /u
/E stdout /I<dir>
/EP stdout, #line /X “ ”
/P
- -
/Zi /Ze ( )
/ZI “ ” /Zl .OBJ
/Z7 /Zg
/Zd /Zs
/Zp[n] n /vd{0|1} / vtordisp
/Za ( /Op) /vm<x>
/Zc:arg1[,arg2] C++ , :
forScope - C++
wchar_t - wchar_t , typedef
- -
@<file> /wo<n> n
/?, /help /w<l><n> n 1-4
/c , /W<n> ( n=1)
/H<num> /Wall
/J char unsigned /Wp64 64
/nologo /WX
/showIncludes /WL
/Tc<source file> .c /Yc[file] .PCH
/Tp<source file> .cpp /Yd .OBJ
/TC .c /Yl[sym] .PCH
/TP .cpp /Yu[file] .PCH
/V<string> /YX[file] .PCH
/w /Y- PCH
/wd<n> n /Zm<n> ( %)
/we<n> n
- -
/MD MSVCRT.LIB /MDd MSVCRTD.LIB
/ML LIBC.LIB /MLd LIBCD.LIB
/MT LIBCMT.LIB /MTd LIBCMTD.LIB
/LD .DLL /F<num>
/LDd .DLL /link [ ]
2.VSL 2010でコンパイル、dll実験の呼び出し一、Cプログラムでpythonを呼び出します.
まず、環境変数にpythonを追加するパスが必要です.これは通常のシステム環境変数パスに追加されています.(試してみましたが、失敗しました.パスの下にデフォルトで追加されたのは全部bin実行プログラムですか?)とは違います.
システム環境変数には2つの変数INCLUDEとLIBが追加され、それぞれpythonディレクトリ下のincludeとlibsに対応しています.
その後、プログラムをテストします.
#include <Python.h>
int main(int argc, char *argv[])
{
Py_Initialize();
PyRun_SimpleString("from time import time,ctime
"
"print 'Today is',ctime(time())
");
Py_Finalize();
return 0;
}
vs 2010 dosウィンドウで実行:cl foo.cはターゲットファイル表示でpython timeライブラリを呼び出した結果を生成することができます.二、C言語を利用してPythonダイナミックリンクを生成する.
前にVS IDEでdllファイルを作成しましたが、今度はdosウィンドウの下でテストしました.
ファイルfoo.
#include <Python.h>
/* Define the method table. */
static PyObject *foo_bar(PyObject *self, PyObject *args);
static PyMethodDef FooMethods[] = {
{"bar", foo_bar, METH_VARARGS},
{NULL, NULL}
};
/* Here's the initialization function. We don't need to do anything
for our own needs, but Python needs that method table. */
void initfoo()
{
(void) Py_InitModule("foo", FooMethods);
}
/* Finally, let's do something ... involved ... as an example function. */
static PyObject *foo_bar(PyObject *self, PyObject *args)
{
char *string;
int len;
if (!PyArg_ParseTuple(args, "s", &string))
return NULL;
len = strlen(string);
return Py_BuildValue("i", len);
}
ファイルのfoo.defを定義します.EXPORTS
initfoo
以下のように実行しますE:\tmp>cl -c foo.c
Microsoft (R) C/C++ Optimizing Compiler Version 16.00.30319.01 for x64
Copyright (C) Microsoft Corporation. All rights reserved.
foo.c
E:\tmp>link foo.obj /dll /def:foo.def /out:foo.dll
Microsoft (R) Incremental Linker Version 10.00.30319.01
Copyright (C) Microsoft Corporation. All rights reserved.
foo.lib foo.exp
三、次はBoost.Pythonに連絡する実験です.