Python C-Api 32-битный PyDict_Check Access Violation, Win7, Python 2.66

Я пытаюсь использовать Python C-Api для 32-битного проекта в VS2010.

Я установил 64-битный и 32-битный Python. Различать два
Версии, я переименовал 32-битную DLL в «python26_32.dll». Я создал соответствующий файл импорта .lib ‘python26_32.lib’ с помощью утилиты VS dumpbin и lib (см. https://adrianhenke.wordpress.com/2008/12/05/create-lib-file-from-dll/).

Я настроил «pyconfig.h» и раскомментировал #pragma comment(lib...) Заявления.

Проекты прекрасно компилируются для 32 бит. Запуск exe дает мне нарушение прав доступа при звонке PyDict_Check, Другие вызовы методов до этого работали нормально (например, Py_Initialize, PyRun_SimpleString, PyDict_New…)

Вот мой маленький пример:

#include "stdafx.h"#include "python.h" //include in stdafx.h has the same result
#include <iostream>

using std::cout; using std::endl;

int _tmain(int argc, _TCHAR* argv[])
{
cout << "Tryin to initialize Python." << endl;
Py_SetPythonHome("D:\\Python26_32");
Py_Initialize();
char *codeString =
"import platform\n""import sys\n""print platform.architecture()[0]\n""print sys.path\n""sys.path.insert(0,'D:\\Python26_32')\n""print sys.path\n";

PyRun_SimpleString(codeString);

PyObject *pDict;
pDict = PyDict_New();
PyDict_SetItemString(pDict, "Key1", PyString_FromString("Value1"));
int i = PyDict_Check(pDict);

cout << "working" << endl;
return 0;
}

Я заметил, что ‘PyDict_Check’ не в экспорте DLL. Это определено в заголовочных файлах python.

Я попытался настроить путь (в Windows и через API (см. Пример)), но это не помогло.

64-битная версия работает нормально (после изменения соответствующих каталогов VC ++ и Py_SetPythonHome Утверждение.

Больше всего меня смущает то, что части c-api работают, а другие нет.

Только что попробовал PyDict_CheckExact, это работает.

Большое спасибо за вашу помощь.

0

Решение

Попробовав другие версии Python (2.7.9) с тем же результатом, я понял, что сборка «Release Version» всегда работала.
После отключения Py_DEBUGв pyconfig.h Debug Build тоже работал для моих нужд.

Хотя я не могу объяснить поведение, это решило проблему для меня. Поэтому я бы отметил проблему как решенную.

0

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