python - 在 python 代码中处理来自 C 库的对象
问题描述
我想将一个 C/C++ 库从一个文件实现为 Python 脚本,以控制HBM 称为 ClipX.dll
的 I/O 设备(以防将来有人需要帮助)。
制造商提供了一个示例 C 实现和一个示例 C++ 实现。在 C 示例中,Connect() 函数返回一些指针,该指针用于后续的读/写函数。在 C++ 示例中,ClipX 类用于建立连接,而读/写函数是该类中的方法。出于这个问题的目的,我已经简化了代码。
基本上,我想使用connect()
该设备,然后再read()
使用它。从我读过的内容来看,Cython 似乎是包装connect()
和read()
作为单独函数并将它们作为模块导入 Python 的好方法。我的问题是:
对于 C 实现,我是否能够在连接后将 MHandle 指针传回 Python 以供以后使用(即调用 read 函数)?指针是否有任何意义,稍后在不同的函数调用中使用?
对于 C++ 实现,是否可以将 dev 对象传递给 Python 代码,以便稍后传回
Read()
? 你可以用任意对象做到这一点吗?
我是一名机械工程师,如果这是胡言乱语或完全不了解情况,请见谅。非常感谢任何指导。
C代码:
/*From .h file*/
----------------------------------------------------
struct sClipX {
void *obj;
};
typedef struct sClipX * MHandle;
ClipX_API MHandle __stdcall Connect(const char *);
----------------------------------------------------
/*End .h file*/
int main()
{
const char * IP = "172.21.104.76";
MHandle m=Connect(IP);
Read(m, 0x4428);
}
C++ 代码:
int main(){
ClipX dev = ClipX();
dev.Connect("172.21.104.76");
dev.Read(0x4428);
解决方案
如果将 C++ 函数声明为 extern "C"
. 这与名称修饰有关
Python 解释器可以使用 C 函数进行扩展。仔细阅读扩展和嵌入 Python 解释器一章。
小心 C++ 异常。您不希望它们跨越 Python 解释器代码。因此,从 Python 调用的任何extern "C"
C++ 函数都应该处理和捕获内部例程引发的异常。
最后,注意内存管理和垃圾收集。P.Wilson 关于单处理器垃圾收集技术的旧论文是相关的,至少对于术语和见解而言。或阅读GC 手册。Python 使用引用计数方案并特别处理弱引用。小心循环引用。
当然要注意 Python 中的GIL。粗略地说,你不能让多个线程在没有预防措施的情况下做 Python 的事情。
设备相关数据的序列化也是一个问题,但您可能不需要它。
最重要的是,记录好您的代码。
像doxygen这样的工具可能会有所帮助(可能使用LaTeX或DocBook)。
当然使用足够好的版本控制系统。我推荐git。也是一个很好的构建自动化工具。
我的建议是将您的 C++ 代码作为开源发布,例如在github或gitlab上。然后,您可以获得有用的代码审查和反馈。
如果您的硬件 + 软件系统对安全至关重要,请考虑使用静态程序分析技术,例如使用Frama-C或Clang 静态分析器或使用您自己的GCC 插件。几个月后(2020 年底),您可能会尝试Bismon(另请阅读此报告草案)。
我肯定有偏见,但我确实建议尝试一些Linux 发行版(例如Ubuntu或Debian)作为您的交叉开发平台。请注意,许多设备(包括RaspBerryPi)都在运行一些嵌入式 Linux 系统,因此学习努力是有意义的。然后阅读高级 Linux 编程
推荐阅读
- javascript - AJAX ON RAILS - 删除后无法更新书签符号,错误 500
- android - Android Kotlin - 意外标记(使用 ';' 分隔同一行上的表达式)
- listview - Flutter Container 高度不继承自 ListView 子项
- java - 应用程序关闭时尝试获取 mainApp 中的文本字段的文本时出现 java.lang.NullPointerException
- elixir - 剥离/检查的惯用方法:ok 和管道第二个 arg
- node.js - 护照不叫
- python - 在 Visual Studio 中的 Python 中插入图像
- ios - 在 Apple App Store 上的应用更新之间更改国家/地区可用性
- vue.js - 如何让 nuxt 子组件等到 asyncData 调用完成
- python - UnimplementedError:不支持将字符串转换为浮点数 [[node Cast (defined at C:/Users/User/.spyder-py3/LSTM.py:132)]]