Почему происходит сбой PyObject_Print?

Я играл с Python 3.3 C-API, чтобы посмотреть, смогу ли я использовать его в запланированном будущем проекте, и почти сразу столкнулся с проблемами.

Даже код это простой сбой с 0xc0000005 в качестве возврата:

#include <Python.h>
#include <cstdio>

int main(){
Py_Initialize();

Py_IncRef(Py_True); //just in case?
PyObject_Print(Py_True,stdout,Py_PRINT_RAW);
Py_DecRef(Py_True);

Py_Finalize();
return 0;
}

Тестирование показывает, что PyObject_Print генерирует сбой. Что не так с этим кодом и / или моей настройкой?

0

Решение

Скорее всего, это связано с неправильной связью. Крушение является обычным явлением, когда File* в вашем коде отличается от File* в библиотеке Python, с которой вы связаны. Это может произойти, когда любимые библиотеки были скомпилированы другим компилятором или другой версией компилятора, который использует другую среду выполнения.

2

Другие решения

У меня был сбой PyObject_Print (), когда я переместил модуль C из Pyhton 2.x -> 3.x

Прежде всего, проверьте, что версия MS VS (MSC) в вашем модуле C соответствует версии, сообщенной Python.

Например, запуск отчетов python.exe:
Python 3.3.2 (v3.3.2: d047928ae3f6, 16 мая 2013, 00:03:43) [MSC v.1600 32 бит (Intel)] на win32

Добавьте fprintf в функцию init вашего модуля:

fprintf (stderr, «C — MSC_VER% d \ n», _MSC_VER);

давая:

C — MSC_VER 1600

Во-вторых, проверьте параметры командной строки.
Опять же, команды для моего простого тестового модуля были:

cl.exe /Fosmod.obj / c / I «% INCLUDE%» / I c: \ python33 \ include smod.c
link.exe / dll /out:smod.pyd smod.obj / LIBPATH: c: \ python33 \ libs

Это привело к сбою моего модуля в PyObject_Print ()!

Быстро прочитав параметры командной строки ‘cl’, я добавил ‘/ MD’:

cl.exe / MD /Fosmod.obj / c / I «% INCLUDE%» / I c: \ python33 \ include smod.c
link.exe / dll /out:smod.pyd smod.obj / LIBPATH: c: \ python33 \ libs

Исправлена!

0