首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >并行运行的多个python程序之间的通信

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

Stack Overflow用户
提问于 2018-04-03 19:44:24
回答 3查看 1K关注 0票数 0

以下是我的设置摘要:

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

最终目标是让C#中的UI启动一个自动测试周期,让数控系统在其中运行。在python程序中,有一个Cnc对象存储设备当前位置,并包含将其定位到特定位置的方法。

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

最后,远程系统从任何工作中被高度抽象出来,只需要开始运行主程序,然后在任何时候使用argz运行移动脚本。

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

编辑:解决了..。一种

handler.py

处理程序将继续从名为input.txt的文本文件中读取数据,寻找新的整数。如果收到,它将更新一个名为output.txt的文本文件以读取'0',然后对输入执行一些操作(即移动数控),然后将'1‘写入output.txt。

代码语言:javascript
复制
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',然后它将打印done并退出。

代码语言:javascript
复制
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")
EN

回答 3

Stack Overflow用户

发布于 2018-04-03 19:55:26

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

票数 2
EN

Stack Overflow用户

发布于 2018-04-03 20:29:23

如果您真的想变得非常简单,请让您的“主”CNC脚本在文件系统上读取指定的目录,以查找具有一个或多个命令的文本文件。如果存在多个文件,请接受最早的文件并执行命令。然后删除该文件(或将其移动到另一个目录)并获取下一个文件。如果没有文件,睡几秒钟再检查一次。恶心地重复。然后,您的C#应用程序只需将一个命令文件写入正确的目录。

票数 2
EN

Stack Overflow用户

发布于 2018-04-05 19:43:15

您最好的选择是将GIPC与GIPC https://gehrcke.de/gipc/结合起来。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49638005

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档