2013-11-01 23 views
0

我想爲我們正在使用的庫建立一個簡單的Python包裝器。但奇怪的是,這個擴展不適用於官方的Python構建,只能使用我自己的Python構建。儘管它們基於相同版本的源代碼。我也是C/C++新手,所以我不確定我的程序是否正確。Windows Python C擴展只適用於我自己的Python版本(使用VC++ 2008 Express的32位版本)

所以方法,我試圖總結的一個是這樣的(從他們的SDK文檔中複製):

語法

無效IoWrite(IOHANDLE HIO,無效* sourceBuffer,長尺寸);

參數

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官方建立2.7 .5,它會崩潰一些使用這個SDK的其他應用程序,但我不知道如果我用我自己的Python 2.7.5與VS 2008 Express一起構建的話,它會出現問題。

非常感謝!

有關編譯器的其他信息: 我使用MS Visual C++ 2008 Express Edition SP1,沒有別的。

my compiler setup

使用編撰的 「C:\ Python27 \ python.exe setup.py打造」 從相同的源代碼 My compiler output

+0

你能描述你如何構建你的擴展。你連接哪個SDK?你如何鏈接運行時? –

+0

@DavidHeffernan嗨!我正在使用帶有SP1的Visual C++ 2008 Express。 –

+0

是的。你連接哪個SDK?你如何鏈接運行時? –

回答

0

大廈可能是不夠的。所有的Python模塊都被加載到一個進程中。這意味着基本的Python和所有模塊都必須使用或多或少的相同編譯參數進行編譯。改變代碼行爲方式的編譯器選項可能會影響已編譯代碼與其他編譯代碼的二進制兼容性。另外,不同的編譯器版本(或不同的編譯器)可能需要不同的編譯器選項來生成兼容的代碼。其中一些因素(編譯器,編譯器版本,所使用的編譯器選項)可能會也可能不會發生變化而不會出現問題。如果您不想花費大量時間和精力去了解哪些因素很重要,那麼通常最好使用相同的編譯器,即相同的編譯器版本,並使用完全相同的編譯器選項。現在你可以通過自己編譯所有東西(並且可能與官方版本不兼容)或者設置與官方版本完全相同的環境來實現這一點。

相關問題