【问题标题】:Python and IronPython communication inquiryPython与IronPython通讯查询
【发布时间】:2016-05-29 07:22:13
【问题描述】:

此程序的目的是使用 Python 通过 GPIB 控制两个测量仪器。

Inst_A:由 CPython 和 PyVISA 控制(IronPython 中尚不可用)。
Inst_B:通过制造商提供的 DLL 库控制; IronPython 及其__import clr__

我尝试过 Python .NET,但返回文件未找到异常,而相同的命令在 IronPython 中有效。会不会和this?有关

Python 3.5.1 (v3.5.1:37a07cee5969, Dec  6 2015, 01:54:25) [MSC v.1900 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import clr
>>> clr.AddReference('QDInstrument')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
System.IO.FileNotFoundException: Unable to find assembly 'QDInstrument'.
   at Python.Runtime.CLRModule.AddReference(String name)

目前,inst_b.py 将在 IronPython 下运行,并在循环中重复执行新的 Python 实例以及 inst_a.py 中的几个参数。

有没有办法让 inst_a.py 在整个采集过程中保持活跃,并能够从 inst_b.py 接收输入数据?在某种意义上像一个听众?

操作系统版本:Windows 7 Professional SP1 amd64
Python 版本:3.5.1
Python .NET 版本:2.1.0(来自 pip)

谢谢你,
保罗。

【问题讨论】:

  • 你能用 pythonnet 发布你失败的代码吗?您仍然可以通过设置 app.config 来使用来自 pythonnet 的 .NET 2.0+ dll。你用的是哪个版本的pythonnet?如果你最终使用的是 ironpython,那么尝试 execnet 与 CPython 进行通信。
  • 这里是如何设置app.config:stackoverflow.com/a/37493025/2230844
  • 对于前者:.NET 4 DLL 当然可以由 python.net 控制,所以你的问题是别的问题,可以作为一个单独的问题。
  • 感谢您的回复。我编辑了原始问题以进行澄清和 Python .NET 异常。
  • 好吧,问题是 import os;导入系统; sys.path.append(os.path.dirname("file")) 解决了这个问题。谢谢 denfromufa!

标签: python .net ironpython measurement python.net


【解决方案1】:

根据 denfromufathis thread,只需在添加引用之前添加 DLL 的路径(在 IronPython 中不是必需的),

import clr
import os
import sys
sys.path.append(os.path.dirname('__file__'))

只需使用SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 2-3: truncated \UXXXXXXXX escape 提供 clr.AddReference 结果的绝对路径。

【讨论】:

  • Unicode 错误是因为您尝试使用 r"full\path\here",它与 Unicode 解码冲突,因此使用双反斜杠而不是转义 "r" 字符串
【解决方案2】:

根据my comment,我将重点关注您的最后一个问题:Python 和 IronPython 之间 IPC 的首选方法。

首先,任何IPC都涉及两件事:

  • 数据通道(管道/流、系统管理的 IPC 实体、共享存储)
  • 数据协议(通信程序、数据格式)

我知道的唯一内置“python 特定”IPC channelmultiprocessing.Queue(和衍生产品)。但它仅在子进程以 multiprocessing 模块启动时才有效——此处不适用。

因此,您仅限于操作系统提供的 IPC 措施。这个话题太宽泛,无法深入研究。乍一看,如果您希望传递的是数据消息序列(而不是信号),那么管道或套接字会作为一种与平台无关且立即显而易见的方式出现在脑海中。


至于数据格式,可以分为两类:

  • 序列化格式和
  • 通信格式

第一组是“简单而愚蠢的”(r),它对可以保存(和恢复)的对象没有任何限制,但由于后者本质上是不安全的。它还固有地依赖于对象的内部表示,因此在不同的代码库之间和在单一架构之外可能不兼容。

  • pickle 是 Python 的第一类内置格式。注意上面的警告,如果底层基本类型的长度相同,您可以期望内置类型的兼容性。
  • json 是第二种灵活格式的示例,struct 是固定格式的示例。

如果您使用流,您还需要以某种方式将传入的字节流拆分为消息。一种简单的方法是发送&lt;data_length&gt;(采用与平台无关的约定格式),然后发送&lt;payload&gt;,另一种可能的方法是使用分隔符(不得在有效负载中出现)。

【讨论】:

  • 嗨 Ivan,问题是我没有将 .dll 文件的目录附加到 sys.path。尽管如此,还是感谢您对 IPC 的见解!
  • @PaulClou 我努力了。现在的问题已经完全改变了焦点,所以与错误无关的所有内容,包括您的设置、“IPC 查询”、我的答案甚至标题 - 如果它保持这种状态,这一切都将被删除和/或删除。这就是为什么我建议提出另一个问题而不是改变这个问题。
  • @PaulCLou 现在,你能做的最好的就是选择哪个问题最终是“真正的”,例如accepting an answer that resolves your problem.
  • 抱歉给大家带来了困惑,我不是故意要浪费你的精力。下次我会更仔细地措辞问题。非常感谢您的帮助,这意义重大!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-10-29
  • 2013-05-25
  • 1970-01-01
  • 1970-01-01
  • 2011-10-02
  • 2012-10-21
  • 1970-01-01
相关资源
最近更新 更多