如何使用Python .Net或ZeroMQ将Python包暴露给C#?

3
我正在开发一个应用程序,它是用Python3编写的,由一个Python库/包(包含核心功能)和一个Python应用程序组成,该应用程序将提供cli shell并处理用户命令。
此外,Python包中包含的功能必须暴露给使用Microsoft .Net框架编写的现有gui应用程序。
我已经进行了相当多的研究,探讨如何实现这一点,并想出了一些潜在的解决方案。
  1. 使用Python.Net在C#应用程序中实现Python脚本,导入我的Python包并调用所需的方法/属性。我自己还无法在monodevelop上实现这一点,但尽管没有关于我的用例的文档,这似乎是一个受欢迎的选择。
  2. 使用CFFI将我的Python库嵌入为DLL。这个选项似乎不需要太多的工作,但很难看到如何维护我在C#中向某人暴露的接口/内容。这个选项也似乎没有太多关于我的用例的支持文档。
  3. 创建一个小型的Python应用程序,通过ZeroMQgRPC导入我的Python包并公开其功能。这似乎是最灵活的选择,并且有充足的文档支持,但我担心延迟问题,因为最终这个工具用于硬件控制。
请注意,我对C#不是很熟悉,将在Linux上进行大部分开发。
我真的很想得到反馈,了解哪个选项能够在库和低延迟/良好性能之间提供最佳平衡(后者更加重要)。

给定引用(cit.):“……我担心延迟问题,因为这个工具用于硬件控制。” - 您的系统控制环路设计的稳定性阈值是多少微秒的延迟上限? - user3666197
我的延迟上限是大约10毫秒,因为有一个极端情况。通常会多100毫秒。 - Reginald Marr
我不确定这个应用程序的具体情况,但是考虑到如此低的延迟要求,您是否考虑过根本不使用Python?由于涉及硬件,您可能可以使用C与其进行交互,并且C很容易与C#集成。 - Emrah Diril
这实际上是替换以前用C实现的东西。想法是,如果库的接口层和cli都用Python实现,用户就更容易根据其用例构建核心功能。 一些更严格的控制循环可能必须作为静态C库或Rust库实现,我们将在Python中调用它们。 无论如何,顶层仍然是用Python实现的,它将需要与C#进行接口。 - Reginald Marr
2个回答

1

目标:在SuT-稳定性下,延迟低于~ 10 [ms]

感谢添加了关于相当广泛的延迟上限~ 10 .. 100 [ms]的详细信息
+

...这实际上是用Python替换以前用C实现的东西。想法是,如果库的接口层和cli都是用Python实现的,那么用户就更容易为他们的用例构建核心功能。一些更严格的控制循环可能必须作为静态C库或Rust库实现,我们将在Python中调用它们。无论如何,顶层仍然是用Python实现的,它将与C#进行接口。
(= 这里最重要的收获...
需要理解希望拥有的用户扩展易用性和重构架构的成本
+ 支付这些成本)


在我们开始寻找解决方案之前:

为了安全、专业地完成这项任务,您很可能会喜欢this,以避免重复未经考虑的常见错误,其中一般性评论源自大量关于创建控制环路下系统~ 80 [us]的第一手经验。

绘制您的控制系统-包括内部生态系统(资源)外部系统(与外界的交互)

enter image description here

接下来是架构:

没有对玩具的充分理解,就无法决定正确的架构。

了解延迟驱动设备的设备景观,需要我们首先了解(阅读+测试+基准测试),并在系统-测试的过载条件下了解其抖动/漫游包络。不了解这一点将导致盲目和缺乏事实支持的信仰,我们的SuT永远不会撞上现实之墙,这将在最不愉快的时刻证明自己是错误的。

这是不可逆转的错误和不良实践,因为到目前为止所产生的所有成本已经被消耗殆尽...

在绘制架构之前,了解和测试是核心步骤 - 在这里,细节很重要(ref.一个人在h2d/d2h延迟中失去多少?[us] - 为什么这些主要成本被报道得如此弱?这是否意味着这些成本不存在?不是的。它们确实存在,您的控制回路每次都会付出代价...因此最好提前了解所有这些隐藏成本,在before Architecture设计和起草之前支付TimeDOMAIN中的费用。)


不要犹豫,尽可能地去分布式 (在合理支持的情况下{{link1:)

从NASA阿波罗任务设计中学习
- 它是深度分布式的

- 适当的工程帮助到达月球
- 它挽救了国家的尊严和这些第一位、迄今为止唯一的外星人的生命
感谢玛格丽特·哈密尔顿女士在定义她的设计规则和改变许多控制环路系统协调策略的适当工程方面的智慧

无论是 ZeroMQ (zmq,作为一种成熟、可组合、良好扩展的基本分布式多对多行为体系结构,开发在一些微不足道的可扩展正式通信模式原型之上) 还是它的Marting SUSTRIK 共同创立的年轻而轻量级的姐妹 nanomsg,都可以帮助人们组合出一个智能的宏系统,在这个宏系统中,各个组件的优势(或者说是由于没有替代品而产生的垄断)可以相互连接成一个仍然满足延迟阈值的 稳定的、具有优先级意识的宏系统,对于这样的系统,在原则上(或者由于其他原因——成本经济、上市时间、法律限制是首要考虑的问题)不能设计成一个单体全能系统。

乍一看,这可能会让问题变得更加复杂,但人们很快就会意识到,它确实起到了完全相反的作用:

  • 不会浪费任何燃料(是的,投资者的钱)在另一个“重新发明轮子”的过程中...
  • 使用业界已经证明可靠的工具通常可以提高可靠性,当然,如果使用正确的话...
  • 性能扩展可能会成为一个不错的副作用,而不是太晚重构的恐慌噩梦。

更不用说这些工具独立演化和进一步扩展所带来的积极影响了。

我的系统也面临着类似的困境——对我来说,#C不是一个选择(闭源应用程序依赖性对我们的成功来说代价太高了,甚至可能是致命的)。

  • CLI:称为远程键盘是分离第一个Python的确切示例,其中远程可以被读作跨大西洋-键盘
  • ML:是城镇中最不受控制的延迟元素,因此需要融合
  • 核心应用程序:使用行业标准DLL扩展为系统,而不让它知道(只有剥离的核心逻辑保留在原地,其他所有内容都分布式处理,以尽量减少所有控制循环的延迟并处理不同级别的优先级)
  • 非阻塞插件:从核心应用程序卸载
  • 核心应用程序(1+N)-热备份-阴影:引入到最初的单片C/S外部系统中

是否有必要添加更多的内容,以便实现分布式和独立于原始供应商锁定?

选择从头开始使用成熟的v2.x版本的ZeroMQ,付出了汗水、眼泪和血汗,但我没有一点后悔,在没有做到这一点的情况下,我无法想象如何满足上述要求。


这似乎是最有吸引力的选择之一。在投入了一些工作来创建一个dll原型后,似乎有自己的缺点(与采取更分散的路线相比),增加了维护dll及其发布过程的成本。我唯一的问题是,在选择zeromq而不是更轻量级的nanomsg,或者像[gRPC] 1或[Thrift] 2这样具有代码生成(语言不可知)的东西中的价值是什么? - Reginald Marr
StackOverflow强烈反对通过评论深入讨论话题,进入新的方向和/或新的问题。请随意打开另一个新问题,并发布新的上下文和任何可能从先前的Q/A中涌现出来的新观点。这是公平和社区礼仪合规的步骤,不是吗? - user3666197
好的,原问题的一部分涉及到zeromq和gRPC之间的比较,但是如果您认为这应该在另一个问题中探讨,我可以这样做,如果研究不足。 - Reginald Marr

0
你说你的Python应用程序有一个CLI,因此另一个潜在选项是通过命令行使您的C#应用程序与您的Python应用程序交互。
您需要通过命令行参数公开Python功能(您可能已经在做了),并且您的Python应用程序需要能够以JSON数据返回结果,这可能是从C#中使用它的最简单方式。
但所有这些都取决于您的C# GUI和Python应用程序之间的交互复杂程度。

2
这难道不会比上述选项慢得多吗? - Reginald Marr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接