私は運が悪いので、ウェブを検索してきました。次の Python コードがあります。
class LED(Structure):
_fields_ = [
('color', c_char_p),
('id', c_uint32)
]
class LEDConfiguration(Structure):
_fields_ = [
('daemon_user', c_char_p),
('leds', POINTER(LED)),
('num_leds', c_uint32)
]
以下は、これらの構造体を使用して LEDConfiguration を返す単純化された関数の例です。
def parseLedConfiguration(path, board):
lc = LEDConfiguration()
for config in configs:
if( config.attributes['ID'].value.lstrip().rstrip() == board ):
lc.daemon_user = c_char_p('some_name')
leds = []
#Imagine this in a loop
ld = LED()
ld.color = c_char_p('red')
ld.id = int(0)
leds.append(ld)
#end imagined loop
lc.num_leds = len(leds)
lc.leds = (LED * len(leds))(*leds)
return lc
これが私が使用しているCコードです(Pythonのセットアップ/「parseLedConfiguration」関数の呼び出しなどに関連するすべてを取り除きましたが、役立つ場合は追加できます)。
/*Calling the python function "parseLedConfiguration"
pValue is the returned "LEDConfiguration" python Structure*/
pValue = PyObject_CallObject(pFunc, pArgs);
Py_DECREF(pArgs);
if (pValue != NULL)
{
int i, num_leds;
PyObject *obj = PyObject_GetAttr(pValue, PyString_FromString("daemon_user"));
daemon_user = PyString_AsString(obj);
Py_DECREF(obj);
obj = PyObject_GetAttr(pValue, PyString_FromString("num_leds"));
num_leds = PyInt_AsLong(obj);
Py_DECREF(obj);
obj = PyObject_GetAttr(pValue, PyString_FromString("leds"));
PyObject_Print(obj, stdout, 0);
私の問題は、最終的な「obj」に返されるものにアクセスする方法を理解することです。「obj」の「PyObject_Print」は、次の出力を示しています。
<ConfigurationParser.LP_LED object at 0x7f678a06fcb0>
上記の「LEDConfiguration」オブジェクトにアクセスするのと同じ方法で、その LP_LED オブジェクトにアクセスできる状態になりたいと考えています。
編集1
おそらくもっと重要な別の質問だと思いますが、私のpythonコードは正しいですか? Python C APIからアクセスできるように、「構造」のリストまたは配列を別の「構造」内に格納する方法はありますか?
ありがとう!