Cから任意のPython3関数にデータの大きなバイト配列を渡す方法を理解するのに本当に苦労しています。参考までに、この件に関するいくつかのドキュメント リンクを次に示します。
https://docs.python.org/3.5/extending/embedding.html
ドキュメント内の情報のほとんどは、Python から C にデータを渡すことを想定しているようです。逆のことを行う必要があります。API 関数への参照を見つけましたが、PyBuffer_FromContiguous
どこにも文書化されていません (見つけることができます)。関数のプロトタイプは次のとおりです。
PyAPI_FUNC(int) PyBuffer_FromContiguous(Py_buffer *view, void *buf,
Py_ssize_t len, char order);
基本的に、私は2つの質問があります:
Py_buffer
これはオブジェクトを構築する正しい方法ですか? これは正しいアプローチですか?Py_buffer
が構築されたら、python 関数の呼び出し用の入力タプル/引数に設定できるにどのようにPy_buffer
関連付けますか?PyObject
これが私が試みているもののコードサンプルです(data_s
typedefを含めるように更新されました):
typedef struct
{
size_t size;
unsigned char* data;
} data_s;
// convert the arguments
PyObject* pArgs;
PyObject* pRes;
Py_buffer* pBuf;
pArgs = PyTuple_New((Py_ssize_t)num_args);
if (num_args)
{
va_start(argp, num_args);
for (i = 0; i < num_args; i++)
{
data_s* arg = va_arg(argp, data_s*);
result = PyBuffer_FromContiguous(pBuf, arg->data, (Py_ssize_t)arg->size, 'C');
if (result < 0)
{
fprintf(stderr, "Error: Unable to copy argument %d into python object\n", i);
PY_DECREF(pArgs);
break;
}
// set pValue, something like this?
PyTuple_SetItem(pArgs, i, pBuf->obj);
}
}
// run the function
pRes = PyObject_CallObject(func_entry->pFunc, pArgs);
// error checking...
…これらの問題に関するリードをいただければ幸いです。