0

我正在尝试在 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_SetPythonHomeStatement.

最让我困惑的是,c-api 的某些部分有效,而其他部分则无效。

刚试过PyDict_CheckExact,这个行得通。

非常感谢您的帮助。

4

1 回答 1

0

在尝试了其他版本的 Python (2.7.9) 后,我认识到构建“发布版本”总是有效的。Py_DEBUG在调试构建中禁用后pyconfig.h也可以满足我的需要。

虽然我无法解释这种行为,但这为我解决了问题。因此,我会将问题标记为已解决。

于 2014-12-22T13:32:57.700 回答