Я играл с 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 генерирует сбой. Что не так с этим кодом и / или моей настройкой?
Скорее всего, это связано с неправильной связью. Крушение является обычным явлением, когда File*
в вашем коде отличается от File*
в библиотеке Python, с которой вы связаны. Это может произойти, когда любимые библиотеки были скомпилированы другим компилятором или другой версией компилятора, который использует другую среду выполнения.
У меня был сбой 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
Исправлена!