在多个并行运行的python程序之间进行通信

时间:2018-04-03 19:44:24

标签: python ssh raspberry-pi cnc

以下是我的设置摘要:

  • 3轴CNC,可通过在raspberry pi上运行的python脚本控制
  • Windows PC可以连接到pi可以运行脚本

最终目标是在C#中创建一个UI来启动CNC运行的自动化测试周期。在python程序中有一个Cnc对象,用于存储设备当前位置并包含定位方法它到某个地方。

问题是如果我每次想要移动CNC时都运行一个新脚本,我必须重新初始化Cnc实例,它会忘记它的位置。所以我想知道我是否可以运行一个包含唯一Cnc实例的主程序,然后当远程机器想要告诉CNC移动时,它可以运行不同的脚本与argz用于新位置python action.py x y z。然后,此脚本可以与主程序通信,以将move方法调用到适当的位置,而无需重新构造新的Cnc对象。 然后理想情况下,主程序将指示动作何时完成并将消息发送回“动作”脚本,该脚本将输出一些信息告诉远程系统动作已完成,然后它将退出,准备再次调用用新的argz。

最后,远程系统从任何工作中得到高度抽象,只需要开始运行主服务器,然后在想要执行运动的任何时候使用argz运行移动脚本。

注意: 我的另一个想法是只保存一个包含当前位置的文本文件,然后始终使用文件中的信息重新初始化实例。

编辑:已解决......有点

handler.py

处理程序将连续读取名为input.txt的文本文件,以查找新的整数。如果收到它,它会将名为output.txt的文本文件更新为'0',然后对输入执行某些操作(即移动cnc),然后将值'1'写入output.txt。

from time import sleep
cur_pos=0

while True:
    with open("input.txt","r") as f:
        pos=f.readline()
    try:
        if pos=='':
            pass
        else:
            pos=int(pos)
    except:
        print pos
        print("exititng...")
        exit()

    if cur_pos==pos or pos=='':
        #suggestion from @Todd W to sleep before next read
        sleep(0.3)
        pass
    else:
        print("Current pos: {0:d}, New pos: {1:d}".format(cur_pos,pos))
        print("Updating...")
        with open("output.txt","w") as f:
            f.write("0")
        #do some computation with the data
        sleep(2)
        cur_pos=pos
        print("Current pos: {0:d}".format(cur_pos))
        with open("output.txt","w") as f:
            f.write("1")

pass_action.py

动作传递器将接受命令行参数,将其写入input.txt,然后等待output.txt读取'1',之后它将打印完成并退出。

import sys
from time import sleep
newpos=sys.argv[1]
with open("input.txt","w") as f:
    f.write(newpos)

while True:
    sleep(0.1)
    with open("output.txt","r") as f:
        if f.readline()=='1':
            break

sys.stdout.write("done")

3 个答案:

答案 0 :(得分:2)

一种可能的方法可能是使用Flask或Bottle等主要python脚本成为webapp。你的应用程序初始化cnc,然后等待HTTP输入,可能在像'move'这样的端点上。然后,您的C#应用​​程序只会发送一个REST请求(HTTP),以便像{'coordinates': [10,15]}一样移动,并且您的应用会对其进行操作。

答案 1 :(得分:2)

如果你真的想变得简单,那么就让你的#34;主要" CNC脚本读取文件系统上的指定目录,查找具有一个或多个命令的文本文件。如果有多个文件,请获取最早的文件并执行命令。然后删除该文件(或将其移动到另一个目录)并获取下一个文件。如果没有文件,请休眠几秒钟并再次检查。重复广告恶心。然后你的C#应用​​程序只需要将命令文件写入正确的目录。

答案 2 :(得分:1)

你最好的办法是将gevent与GIPC https://gehrcke.de/gipc/

结合起来

这允许对堆栈进行异步调用,以及在不同进程之间进行通信。