gpt4 book ai didi

c++ - Windows Python C 扩展仅适用于我自己的 Python 构建(使用 VC++ 2008 Express 的 32 位构建)

转载 作者:行者123 更新时间:2023-11-30 17:45:09 24 4
gpt4 key购买 nike

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

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

Syntax

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

Parameters

hIo The handle to the IO signal, i.e. the return value from the IoConnect operation.

sourceBuffer The parameter containing the value that the IO signal should have.

size The size of the signal to write.

Return value

No return value used.

代码示例

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 版本 2.7.5,它会使其他一些使用此 SDK 的应用程序崩溃,但如果我将它与我自己使用 VS 2008 Express 构建的 Python 2.7.5 一起使用,则没有问题。

非常感谢!

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

my compiler setup

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

最佳答案

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

关于c++ - Windows Python C 扩展仅适用于我自己的 Python 构建(使用 VC++ 2008 Express 的 32 位构建),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19724415/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com