Python 如何确定哪对伪tty端口相互连接

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/

我有两个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/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,'')中的行的
-我的解决方案不起作用吗?我知道有些人使用这种形式的管道,但我一般没有看到任何需要。