[英]Communicating between multiple python programs running in parallel
以下是我的设置摘要:
最终目标是使用C#制作的UI来启动要运行的CNC的自动化测试周期。在python程序中,有一个Cnc
对象,该对象存储设备的当前位置并包含将其定位到特定位置的方法。
问题是,如果我每次要移动CNC时都运行一个新脚本,则必须重新初始化Cnc
实例,它将忘记它的位置。 所以我想知道是否可以运行一个包含一个唯一的Cnc
实例的主程序,那么当远程计算机想要告诉CNC移动时,它可以为新位置python action.py xyz
运行带有argz的不同脚本。 python action.py xyz
。 然后,该脚本可以与主程序进行通信,以将move
方法调用到适当的位置,而不必重新构造新的Cnc
对象。 然后,理想情况下,主程序将指示运动何时完成,并将消息发送回“动作”脚本,该脚本将输出一些内容以告知远程系统动作已完成,然后退出,准备再次调用与新的argz。
最后,远程系统从任何工作中都高度抽象化,只需要开始运行主系统,然后在需要执行运动的任何时候使用argz运行move脚本。
注意:我的另一个想法是只保存当前位置的文本文件,然后始终使用文件中的信息重新初始化实例。
编辑:解决...有点
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")
一种可能的方法可能只是使用Flask或Bottle来使您的主要python脚本成为webapp。 您的应用程序初始化cnc,然后等待HTTP输入,可能在“ move”之类的端点上。 然后,您的C#应用程序仅发送一个REST请求(HTTP)进行移动,就像{'coordinates': [10,15]}
,您的应用程序将对此进行操作。
如果您真的想变得简单,请让您的“主要” CNC脚本读取文件系统上的指定目录,以查找具有一个或多个命令的文本文件。 如果有多个文件,请获取最早的文件并执行命令。 然后删除文件(或将其移动到另一个目录)并获取下一个文件。 如果没有文件,请睡眠几秒钟,然后再次检查。 重复广告恶心。 然后,您的C#应用程序只需要将命令文件写入正确的目录。
您最好的选择是将gevent与GIPC结合使用https://gehrcke.de/gipc/
这允许异步调用堆栈,以及在单独的进程之间进行通信。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.