使用SWIG使用第三方驱动程序构建Python模块

问题描述 投票:0回答:1

我正在使用第三方供应商,该供应商提供Windows驱动程序(DLL)和C头文件。我正在尝试使用SWIG将头文件重新编译为Python模块。

以下是我的文件:-BTICard.i-BTICard.h-BTICARD64.dll-BTICARD64.lib

SWIG界面源

%module BTICard
%include <windows.i>
%{
#define SWIG_FILE_WITH_INIT
#include "BTICard.H"
#define BTICardAPI
%}

在Cygwin中,我使用了以下命令:

swig -python -py3 BTICard.i

随后将生成以下文件:-BTICard.py-BTICard_wrap.c

在Cygwin中,为Python模块编译

gcc -c -fpic BTICARD.H BTICard_wrap.c -I/usr/include/python3.8

现在允许将BTICard用Pyt​​hon导入

import BTICard
import ctypes
BTICarddll = ctypes.WinDLL('BTICARD64')
pRec1553 = SEQRECORD1553() # Doesn't initialize

BTICard.H包含以下内容:typedef struct-用于初始化各种字段结构枚举-常量声明

根据SWIG文档,应该将typedef结构转换为Python类。当我尝试初始化类时,出现了NameError。我怀疑问题出在我的界面文件无法识别这些类型,因此无法转换它们。

[进一步调查,我尝试使用distutils方法并创建了setup.py

#!/usr/bin/env python3.8
"""
setup.py file for SWIG
"""
from distutils.core import setup, Extension

example_module = Extension('_BTICard',
    sources=['BTICard_wrap.c', 'BTICard.h'],)

setup (name = 'BTICard',
    version = '0.1',
    author = "TESTER",
    description = """BTICard API""",
    ext_modules = [example_module],
    py_modules = ["BTICard"],
    )

构建软件包:

$ python3.8 setup.py build_ext --inplace
running build_ext
building '_BTICard' extension
error: unknown file type '.h' (from 'BTICard.h')

这里是什么问题?

从gcc创建对象后,有没有办法可以访问Python源文件?

我要做的就是验证似乎有问题的单独的Python包装器(这是一个完全独立的主题)。还有另一种方法可以创建此Python模块吗?

python oop visual-c++ ctypes swig
1个回答
0
投票

.i文件不包括要导出的界面。它应该看起来像:

%module BTICard

%{
#include "BTICard.H"    // this just makes the interface available to the wrapper.
%}

%include <windows.i>
%include "BTICard.h"    // This wraps the interface defined in the header.

[setup.py了解SWIG接口,因此来源应为:

sources=['BTICard.i']

标题包含在源中,未在as源中列出。您可能需要其他选择,但这应该可以使您走上正确的轨道。

© www.soinside.com 2019 - 2024. All rights reserved.