このようなシステムを実装するには多くのオプションがありますが、最も簡単な方法の1つは、アプリケーションにスクリプト言語のインタープリターを埋め込むことです。
今日は、このオプションの実装を取り上げます。 Pythonがスクリプト言語として選択されたのは、かなり幅広いアプリケーションがあるためです。
クロスプラットフォームであり、Windows、Linux、MacOSの公式バージョンがあります。 最終的には、少なくとも悪名高いグーグル企業で主要プログラミング言語として使用されているという事実は、この言語の力と可能性について語ることができます。
開始するには
www.python.orgから最新の言語インタープリターリリースをダウンロードし、どこかにインストールします。 次のファイルを確認します。
{インストールパス} \ Python \ include \ Python.h
{インストールパス} Python \ libs \ python31.lib(またはgccを使用している場合はlibpython31.a)
これらのファイルが存在しない場合は、公式サイトからインタープリターのソースコードをダウンロードし、どこかで解凍する必要があります。 IDE(MS VS 2005など)でプロジェクトを作成し、プラグイン設定でこれらのファイルを含むフォルダーへのパスを書き留めます。
簡単なプログラム
#include
int main(int argc, char *argv[])
{
Py_Initialize(); //
PyRun_SimpleString("from time import time,ctime\n"
"print('Today is', ctime(time()))\n");
//
Py_Finalize(); // ,
return 0;
}
今それについて議論します。
最初のステップは、Python.hを接続してPython APIにアクセスすることです。
インタプリタで作業する前に、Py_Finalizeが終了した後、Py_Initializeを呼び出す必要があります。 必要なスクリプトを呼び出す1つの方法は、PyRun_SimpleString関数です。
スクリプトの文字列をパラメーターとして受け取り、実行します。 上記の例では、関数は現在の時刻を表示します。 ただし、ほとんどの場合、これでは十分ではありません。
関数実行の結果を取得する
matをプロットするプログラムが必要だとします。 機能。 これがy = x + 1-cos(x)のような単純な関数である場合、入力に問題はありません。逆ポーランド記法に基づいた単純な式パーサーを記述するだけです。 しかし、関数はより複雑になる可能性があります。例えば:
ユーザー入力の編成にはすでに問題があります。 ただし、ユーザーがスクリプト言語でこの関数を作成できるようにすることはできます。 たとえば、同じPythonで。 これが私たちがやることです。 開始するには、次のことを行う必要があります。
- Pythonで記述された関数にパラメーターを渡す
- 実施します
- 結果を得る
そして、Pythonの関数y(x)は次のように書かれています。
def func(x):
if x > 3:
return x + 1
elif 1 < x <= 3:
return 0
else:
return x ** x
モジュールから関数y(x)でスクリプトを呼び出す関数:
double compute(double x)
{
PyObject *pName, *pModule, *pFunc;
PyObject *pArgs, *pValue;
double result = 0.0;
Py_Initialize();
pName = PyUnicode_FromString("mod");
pModule = PyImport_Import(pName);
Py_DECREF(pName);
if (pModule != NULL)
{
pFunc = PyObject_GetAttrString(pModule, "func");
if (pFunc && PyCallable_Check(pFunc))
{
pArgs = PyTuple_New(1);
PyTuple_SetItem(pArgs, 0, PyFloat_FromDouble(x));
pValue = PyObject_CallObject(pFunc, pArgs);
Py_DECREF(pArgs);
if (pValue != NULL)
{
result = PyFloat_AsDouble(pValue);
Py_DECREF(pValue);
}
}
Py_XDECREF(pFunc);
Py_DECREF(pModule);
}
Py_Finalize();
return result;
}
この記事の目的は、Pythonをアプリケーションに組み込む際の主なポイントについて説明することなので、あまり詳しく説明することなく、使用する関数について説明します。 詳細については、公式Webサイトのドキュメントを参照してください。
Py * _From *という形式の関数を使用すると、組み込みのC / C ++型をPython内部型に変換できます。 つまり、たとえば、PyUnicode_FromStringはその文字列パラメーターをPythonの内部Unicode表現に変換し、言語インタープリターが(パラメーターを使用して)作業できるようにします。 Py * _As *という形式の関数は逆の効果があります(つまり、タイプをインタープリターの内部表現からC / C ++組み込みタイプに変換します)。
PyImport_Importを使用すると、パラメーターとして名前が指定されているモジュールの機能にアクセスできます。 もちろん、パラメータの型は最初に内部表現に変換する必要があります。
Py_DECREFは、インタープリターが使用するデータによって占有されているメモリを解放するマクロです。 このマクロはPy_XDECREFとは異なり、後者はパラメーターとしてnull値を取ることができます。 たとえば、次のスニペットは文字列「mod」を内部Python型に変換し、必要なモジュールをロードします。
pName = PyUnicode_FromString("mod");
pModule = PyImport_Import(pName);
Py_DECREF(pName);
その後、文字列を含むオブジェクトは不要になったため、Py_DECREFを使用してメモリがクリアされます。
PyObject_GetAttrStringは、2番目に指定された名前を持つ最初のパラメーターとして指定されたモジュールから関数ポインターを返します。
いわゆる「タプル」は、パラメーターを関数に渡すために使用されます。 さらに、簡単にするために、これらをタプルと呼びます。 タプルは、さまざまなタイプの特定の数の値のセットです。 新しいタプルを作成するには、渡す引数の数を指定してPyTuple_New関数を使用します。 次に、最初の引数がタプル、2番目が引数のシーケンス番号、3番目がその値であるPyTuple_SetItemを使用して、タプルに値が入力されます。 その後、PyObject_CallObject関数を呼び出して、関数と引数のタプルを渡すことができます。
現在、入力データのユーザー入力を整理することは問題ではありません。
おわりに
ここでは、Python-aのすべての可能性は明らかにされていませんが、この記事は学習の出発点として役立ち、 www.python.orgのドキュメントがこれに役立ちます。