gpt4 book ai didi

python - 如何判断哪一对伪tty端口相互连接

转载 作者:太空宇宙 更新时间:2023-11-04 04:44:50 25 4
gpt4 key购买 nike

我有两个 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()

关于python - 如何判断哪一对伪tty端口相互连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49847650/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com