Я пытаюсь использовать 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
, это работает.
Большое спасибо за вашу помощь.
Попробовав другие версии Python (2.7.9) с тем же результатом, я понял, что сборка «Release Version» всегда работала.
После отключения Py_DEBUG
в pyconfig.h
Debug Build тоже работал для моих нужд.
Хотя я не могу объяснить поведение, это решило проблему для меня. Поэтому я бы отметил проблему как решенную.