Python和IronPython通信查询

2024-09-30 20:33:39 发布

您现在位置:Python中文网/ 问答频道 /正文

本程序的目的是用Python语言通过GPIB控制两台测量仪器。在

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

我尝试过Python.NET,但返回的是file not found exception,而同样的命令在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峎y活动,并能够接收来自inst峎y的输入数据?从某种意义上说就像一个倾听者?在

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

谢谢,
保罗。在


Tags: pyimport程序目的版本语言net仪器
2条回答

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

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

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

根据my comment,我将集中讨论最后一个问题:在Python和IronPython之间IPC的首选方式。

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

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

我知道的唯一一个内置的“python-specific”IPCchannelmultiprocessing.Queue(及其派生)。但它只在子进程是用multiprocessing模块启动时才起作用的,这在这里不适用。在

因此,您只能使用操作系统提供的IPC度量。这个话题太宽泛了,无法深入研究细节。乍一看,如果您希望传递的是一系列数据消息(而不是信号),那么管道或套接字就会被认为是一种与平台无关且立即显而易见的方式。在


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

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

第一个组是“simple&stuble”(r),对它可以保存(和恢复)的对象没有约束,但是由于后者,它本质上是不安全的。它还固有地依赖于对象的内部表示,因此在不同的代码基之间和在单一体系结构之外可能不兼容。在

  • pickle是Python第一种类型的内置格式。注意上面的警告,如果基础基元类型的长度相同,则可以期待内置类型的兼容性。在
  • json是第二种灵活格式的一个例子,struct是固定格式的一个例子。在

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

相关问题 更多 >