我正在尝试在 VS2010 中将 Python C-Api 用于 32 位项目。
我已经安装了 64 位和 32 位 Python。为了区分这两个版本,我将 32 位 dll 重命名为“python26_32.dll”。我已经使用 VS dumpbin 和 lib 工具创建了一个相应的导入 .lib 文件“python26_32.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
Statement.
最让我困惑的是,c-api 的某些部分有效,而其他部分则无效。
刚试过PyDict_CheckExact
,这个行得通。
非常感谢您的帮助。