Вы можете использовать PyUnicode_AsEncodedString, который
кодирует объект Unicode и возвращает результат как Python байтовый объект. кодировка и ошибки имеют то же значение, что и одноименные параметры в методе Unicode encode (). Используемый код c ищется с помощью реестра Python code c. Вернуть NULL, если исключение было вызвано кодом c.
см. https://docs.python.org/3/c-api/unicode.html#c .PyUnicode_AsEncodedString
Затем с PyBytes_AsString вы получите указатель на внутренний буфер с завершающим байтом NUL. Этот буфер нельзя ни освобождать, ни изменять. Если вам нужна копия, вы можете использовать, например, strdup.
см. https://docs.python.org/3/c-api/bytes.html#c .PyBytes_AsString
Слегка изменив свой код, он может выглядеть так:
PyObject *encodedString = PyUnicode_AsEncodedString(commandString, "UTF-8", "strict");
if (encodedString) { //returns NULL if an exception was raised
char *commandChars = PyBytes_AsString(encodedString); //pointer refers to the internal buffer of encodedString
if(commandChars) {
printf("the string '%s' consists of the following chars:\n", commandChars);
for (int i = 0; commandChars[i] != '\0'; i++) {
printf("%c ", commandChars[i]);
}
printf("\n");
}
Py_DECREF(encodedString);
}
Если провести тестирование с:
import cExt
fruits = ["apple", "pears", "cherry", "pear", "blueberry", "strawberry"]
res = cExt.listCheck(fruits)
print(res)
Результатом будет:
the string 'apple' consists of the following chars:
a p p l e
the string 'pears' consists of the following chars:
p e a r s
the string 'cherry' consists of the following chars:
c h e r r y
the string 'pear' consists of the following chars:
p e a r
the string 'blueberry' consists of the following chars:
b l u e b e r r y
the string 'strawberry' consists of the following chars:
s t r a w b e r r y
[1, 1, 1, 1, 1, 1]
Боковое примечание, не имеющее прямого отношения к вопросу: ваша функция CitemCheck возвращает указатель на int , но если посмотреть, как он вызывается, кажется, что вы хотите вернуть значение типа int. Сигнатура функции должна выглядеть примерно так:
static int CitemCheck(PyObject *commandString, int commandStringLength)
(обратите внимание на удаленный *
после int).