我正在尝试在c#应用程序和c#将调用的python脚本之间进行双向通信。
我在c#中有一些输入通道在高频率(5000-1000 data / s)下不断变化,让我们说一分钟。在这些输入的每次更改时,计算结果并将其分配给输出变量。我想要做的是将逻辑移动到python脚本。例如:
所以python脚本应该能够读取输入,执行逻辑并以类似的频率写入结果。
任何推荐?以前有人做过类似的事吗?
首先,我尝试在每次更改时调用脚本并读取控制台输出。但是脚本中的代码并不像z = x * y那么简单,并且pyhon脚本中需要存储值的变量。例如,脚本mught想要保存x和y达到的最大值。
我看过ZeroMQ库进行通信,不知道如何使用它。
这是一个解决方案:
简单的C#程序:发送数据和接收的客户端
using System;
using ZeroMQ;
namespace ZeroMQ_Client
{
class Program
{
static void Main(string[] args)
{
using (var requester = new ZSocket(ZSocketType.REQ))
{
// Connect
requester.Connect("tcp://127.0.0.1:5555");
for (int n = 0; n < 10; ++n)
{
string requestText = "Hello";
Console.Write("Sending {0}...", requestText);
// Send
requester.Send(new ZFrame(requestText));
// Receive
using (ZFrame reply = requester.ReceiveFrame())
{
Console.WriteLine(" Received: {0} {1}!", requestText, reply.ReadString());
}
}
}
}
}
}
python程序,你必须安装pyzmq:
#
# Hello World server in Python
# Binds REP socket to tcp://*:5555
# Expects b"Hello" from client, replies with b"World"
#
import time
import zmq
context = zmq.Context()
socket = context.socket(zmq.REP)
socket.bind("tcp://*:5555")
while True:
# Wait for next request from client
message = socket.recv()
print("Received request: %s" % message)
# Do some 'work'
time.sleep(1)
# Send reply back to client
socket.send(b"World")