Python 如何确定哪对伪tty端口相互连接
我有两个python程序,它们通过点对点tty串行连接相互通信。为了模拟连接,我使用socat创建了一个双向字节流,如下所示:Python 如何确定哪对伪tty端口相互连接,python,serial-port,pty,socat,Python,Serial Port,Pty,Socat,我有两个python程序,它们通过点对点tty串行连接相互通信。为了模拟连接,我使用socat创建了一个双向字节流,如下所示: socat -d -d pty,raw,echo=0 pty,raw,echo=0 控制台返回以下信息,指示现在连接在一起的两个pty端口: 2018/04/15 22:33:03 socat[18197] N PTY is /dev/pts/2 2018/04/15 22:33:03 socat[18197] N PTY is /dev/pts/3 2018/04/
socat -d -d pty,raw,echo=0 pty,raw,echo=0
控制台返回以下信息,指示现在连接在一起的两个pty端口:
2018/04/15 22:33:03 socat[18197] N PTY is /dev/pts/2
2018/04/15 22:33:03 socat[18197] N PTY is /dev/pts/3
2018/04/15 22:33:03 socat[18197] N starting data transfer loop with FDs [5,5] and [7,7]
然后,我必须手动修改两个程序中的每一个,以指定每个程序的串行连接,例如:
在程序A.py中:
import serial
...
ser = serial.Serial('/dev/pts/2')
在程序B.py中:
import serial
...
ser = serial.Serial('/dev/pts/3')
我想要的是一个脚本,它将设置socat连接,然后执行a.py并将一个端口号作为参数传递给它,然后执行B.py并将另一个端口号作为参数传递给它
我尝试了一个bash脚本,但是socat
命令阻塞了,我无法捕获它的stderr输出以将其放入变量中。如果可以的话,我就可以解析这个变量,开始我的快乐之旅
有什么想法吗?或者是更好的方法
谢谢大家! 您可以使用python中的低级
Popen
类运行socat
,而无需阻塞。您需要重定向stderr
,以便扫描它以查找pty名称,但在获得所需信息后,您可以将其交给后台线程
import sys
import subprocess as subp
import threading
import shutil
import re
socat_proc = subp.Popen(['socat', '-d', '-d', 'pty,raw,echo=0', 'pty,raw,echo=0'],
stderr=subp.PIPE)
try:
# scan output for 2 ptys
ptylist = []
for line in socat_proc.stderr:
line = line.decode().strip()
print(line)
pty = re.search(r"N PTY is (.+)", line)
if pty:
ptylist.append(pty.group(1))
if len(ptylist) == 2:
break
if socat_proc.poll() is not None:
print("badness. socat dead.")
exit(2)
# background thread consumes proc pipe and sends to stdout
socat_thread = threading.Thread(target=shutil.copyfileobj,
args=(socat_proc.stdout, sys.stdout))
socat_thread.daemon = True
socat_thread.start()
print("pty", ptylist)
# now you can start your programs...
finally:
socat_proc.terminate()
你太棒了!太棒了,正是我需要的。我投了赞成票,但我的分数很低,所以在公共页面上不会显示赞成票。我注意到您的编辑更改为iter(socat_proc.stderr.readline,'')中的行的
:
-我的解决方案不起作用吗?我知道有些人使用这种形式的管道,但我一般没有看到任何需要。