3

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つの質問があります:

  1. Py_bufferこれはオブジェクトを構築する正しい方法ですか? これは正しいアプローチですか?
  2. Py_bufferが構築されたら、python 関数の呼び出し用の入力タプル/引数に設定できるにどのようにPy_buffer関連付けますか?PyObject

これが私が試みているもののコードサンプルです(data_stypedefを含めるように更新されました):

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... 

…これらの問題に関するリードをいただければ幸いです。

4

1 に答える 1

1

問題は、必要なものに対する適切な API 呼び出しが見つからなかったことです。これは、この問題を解決する呼び出しです (誰かが気になる場合):Py_BuildValueそしてここに文書化されています:

https://docs.python.org/3/extending/extending.html#building-arbitrary-values

于 2015-11-21T00:17:43.857 に答える