Если вам нужно написать в Python sys.stdout
из C-кодированного расширения, вы можете использовать что-то вроде:
void writeout(const char* nullterminated)
{
PyObject* sysmod = PyImport_ImportModuleNoBlock("sys");
PyObject* pystdout = PyObject_GetAttrString(sysmod, "stdout");
PyObject* result = PyObject_CallMethod(pystdout, "write", "s", nullterminated);
Py_XDECREF(result);
Py_XDECREF(pystdout);
Py_XDECREF(sysmod);
}
(плюс, предположительно, небольшая проверка ошибок - просто для здравого смысла, на случай, если кто-то совершил что-то сумасшедшее, например del sys.stdout
& c; -).
Конечно, если вам нужно несколько записей, может быть более эффективно получить stdout
только один раз, хранить его столько раз, сколько необходимо, и дешифровать его только один раз, когда вы закончите «печатать» материал (но это не будет работать правильно в тех случаях, когда ваш вызывающий Python переназначает sys.stdout
, в то время как вы сохраняете ссылку на его предыдущую версию: вы будете продолжать печатать в предыдущую версию, точно так же как в Python-кодированном модуле аналогичного поведения) , Этот повторный поиск эквивалентен выполнению sys.stdout.write(somestring)
в Python, который также ищет вещи каждый раз - немного медленнее, но "семантически безопаснее" в случае, если ваш вызывающий Python делает "довольно острые" вещи с sys.stdout
(как Вы узнали, что делает IDLE ;-). ((На самом деле не все так остро, поэтому вы можете поддержать его должным образом; -)).