[英]Using SWIG to build Python Module using 3rd-Party Drivers
我正在使用提供 Windows 驅動程序 (DLL) 和 C Header 文件的第 3 方供應商。 我想做的是使用 SWIG 將 header 文件重新編譯為 Python 模塊。
這是我的文件:
- BTICard.i
- BTICard.h
- BTICARD64.dll
- BTICARD64.lib
%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
現在允許在 Python 中導入 BTICard
import BTICard
import ctypes
BTICarddll = ctypes.WinDLL('BTICARD64')
pRec1553 = SEQRECORD1553() # Doesn't initialize
BTICard.H 包含以下內容:
typedef struct - 用於初始化各種字段結構
枚舉 - 常量聲明
根據 SWIG 文檔,typedef 結構應該被轉換為 Python 類。 當我嘗試初始化 class 時,我收到了 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"],
)
要構建 package:
$ python3.8 setup.py build_ext --inplace
running build_ext
building '_BTICard' extension
error: unknown file type '.h' (from 'BTICard.h')
這里有什么問題?
從 gcc 創建 object 后,有沒有辦法可以訪問 Python 源文件?
我要做的就是驗證一個似乎有問題的單獨 Python Wrapper(這是一個完全獨立的主題)。 還有其他方法可以創建這個 Python 模塊嗎?
.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 接口,因此將.i
文件直接包含為源。 標頭包含在來源中,並且未列為來源。 您可能需要其他選擇,但這應該讓您走上正軌。 您可能需要 DLL 導出庫 ( BTICard.lib
) 並且還需要鏈接到該庫:
example_module = Extension('_BTICard',
sources=['BTICard.i'],
libraries=['BTICard.lib'])
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.