0

使用しているライブラリ用の単純な Python ラッパーを構築しようとしています。しかし奇妙なことに、この拡張機能は公式の Python ビルドでは機能せず、私自身の Python ビルドでのみ機能します。それらは同じバージョンのソース コードに基づいていましたが。私も C/C++ 初心者なので、自分のプログラムが正しいかどうかわかりません。

したがって、ラップしようとしているメソッドの 1 つは次のようなものです (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 ビルド 2.7.5 を使用すると、この SDK を使用する他のいくつかのアプリケーションがクラッシュしますが、VS 2008 Express でビルドされた独自の Python 2.7.5 で使用する場合は問題ありません。

どうもありがとう!

コンパイラに関する追加情報: MS Visual C++ 2008 Express Edition SP1 を使用していました。

私のコンパイラ設定

「C:\Python27\python.exe setup.py build」を使用してコンパイル 私のコンパイラ出力

4

1 に答える 1

0

同じソース コードからビルドするだけではおそらく十分ではありません。すべての Python モジュールが 1 つのプロセスに読み込まれます。これは、基本の Python とすべてのモジュールをほぼ同じコンパイル パラメータでコンパイルする必要があることを意味します。コードの動作を変更するコンパイラ オプションは、コンパイルされたコードと他のコンパイルとのバイナリ互換性に影響を与える可能性があります。また、異なるコンパイラ バージョン (または異なるコンパイラ) では、互換性のあるコードを生成するために異なるコンパイラ オプションが必要になる場合があります。これらの要因 (コンパイラ、コンパイラのバージョン、使用されるコンパイラ オプション) のいくつかは、問題を起こさずに変更される場合と変更されない場合があります。どの要素が重要かを知るために多くの時間とエネルギーを費やしたくない場合は、通常、同じコンパイラ、同じコンパイラ バージョン、まったく同じコンパイラ オプションを使用することをお勧めします。

于 2013-11-01T10:54:14.517 に答える