【问题标题】:Windows Python C extension only works with my own Python build (32-bit build using VC++ 2008 Express)Windows Python C 扩展仅适用于我自己的 Python 构建(使用 VC++ 2008 Express 的 32 位构建)
【发布时间】:2013-11-12 12:22:04
【问题描述】:

我正在尝试为我们正在使用的库构建一个简单的 Python 包装器。但奇怪的是,这个扩展不适用于官方的 Python 构建,只能用于我自己的 Python 构建。即使它们基于相同版本的源代码。我也是一个C/C++菜鸟,所以我不确定我的程序是否正确。

所以我试图包装的一种方法是这样的(从他们的 SDK 文档中复制):

语法

void IoWrite(IOHANDLE hIo, void * sourceBuffer, long size);

参数

hIo IO 信号句柄,即 IoConnect 操作的返回值。

sourceBuffer 包含 IO 信号应具有的值的参数。

size 要写入的信号的大小。

返回值

没有使用返回值。

代码示例

IOHANDLE hIoSig;
long ioVariable = 10;

hIoSig = IoConnect("IoSigName", sizeof(ioVariable));
IoWrite(hIoSig, &ioVariable, sizeof(ioVariable));

这是 Python 扩展:

#include "Python.h"
#include <conio.h>
#include "SimIoPort.h"

static PyObject *
ex_IoWrite(PyObject *self, PyObject *args)
{
char *IoPortName;
long PortValue;
IOHANDLE hIOsignal;

if (!PyArg_ParseTuple(args, "si", &IoPortName, &PortValue))
{
    return NULL;
}

hIOsignal = IoConnect(IoPortName, sizeof(PortValue));
IoWrite(hIOsignal, &PortValue, sizeof(PortValue));

Py_INCREF(Py_None);
return Py_None;
}

static PyMethodDef SimIo_methods[] = {
    {"io_write", ex_IoWrite, METH_VARARGS,
    "IoWrite method."},
    {NULL, NULL, 0, NULL}
};

PyMODINIT_FUNC
initSimIo(void)
{
    Py_InitModule("SimIo", SimIo_methods);
}

这是我的 setup.py:

from distutils.core import setup, Extension

simio_module = Extension('SimIo',
                        include_dirs = ['Headers', 'Libs'],
                        libraries = ['user32', ],
                        sources = ['SimIoModule.c', 'Libs\SimIoPort.c'],
                        )


setup(name = "SimIo",
    version = "0.1",
    description = "SimIo",
    ext_modules = [simio_module],
)

如果我使用官方的 Python build 2.7.5,它会导致一些使用此 SDK 的其他应用程序崩溃,但如果我将它与我自己使用 VS 2008 Express 构建的 Python 2.7.5 一起使用,我没有问题。

非常感谢!

有关编译器的其他信息: 我使用的是带有 SP1 的 MS Visual C++ 2008 Express Edition,仅此而已。

使用“C:\Python27\python.exe setup.py build”编译

【问题讨论】:

  • 你能描述一下你是如何构建你的扩展的吗?您要链接哪个 SDK?你是如何链接运行时的?
  • @DavidHeffernan 嗨!我使用的是带有 SP1 的 Visual C++ 2008 Express。
  • 是的。您要链接哪个 SDK?你是如何链接运行时的?
  • 您是否在 Python 版本中运行了 setup.py?尝试使用官方 Python 运行它。
  • @DavidHeffernan 我认为它是 MS VC9.0 32 位。我真的不知道我是如何链接它的:P 我刚刚运行了“python setup.py build”。

标签: c++ python c windows python-extensions


【解决方案1】:

从相同的源代码构建可能还不够。所有 Python 模块都加载到一个进程中。这意味着必须使用或多或少相同的编译参数来编译基础 Python 和所有模块。更改代码行为方式的编译器选项可能会影响已编译代码与其他编译的二进制兼容性。此外,不同的编译器版本(或不同的编译器)可能需要不同的编译器选项来生成兼容的代码。其中一些因素(编译器、编译器版本、使用的编译器选项)可能会或可能不会更改而不会遇到麻烦。如果您不想花费大量时间和精力来了解哪些因素是重要的,通常最好使用相同的编译器,相同的编译器版本,以及完全相同的编译器选项。现在,您可以通过自己编译所有内容(并且可能与官方版本不兼容)或设置与官方版本完全相同的环境来实现这一目标。

【讨论】:

    猜你喜欢
    • 2011-08-01
    • 1970-01-01
    • 2019-05-16
    • 2016-11-04
    • 2020-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多