在一个 C 程序中,我想运行一个 Python 交互式循环,该循环从一个伪终端(例如 pts/4)获取输入并将其输出到与启动 C 程序的终端(例如 pts/1)不同的伪终端(例如 pts/4) .
运行交互式循环的基本方法是:
PyRun_InteractiveLoop(stdin, "<stdin>");
然而,这并不能解决问题,因为它使用的是启动程序的伪终端 (pts/1),而不是 pts/4。
一个有效的解决方案是:
int fd = open("/dev/pts/4", O_RDWR);
dup2(fd, 0);
dup2(fd, 1);
dup2(fd, 2);
PyRun_InteractiveLoop(stdin, "<stdin>");
此解决方案的缺点是它使文件描述符 0 1 2 无法与启动程序的伪终端进行通信。虽然这些描述符可以事先复制,但有些函数坚持使用 0 1 2 并且不能使用复制的 fds。
理想情况下,我们希望交互式循环不依赖 fds 0 1 2,并像这样在 /dev/pts/4 上运行:
FILE *pts = fopen("/dev/pts/4", "rw");
PyRun_InteractiveLoop(pts, "/dev/pts/4");
不幸的是,这并没有按预期工作,并且与使用标准输入具有相同的效果,标准输入默认使用启动程序的伪终端。
所以问题是双重的:
- 如果 PyRun_InteractiveLoop() 只能在 stdin / fds 0 1 2 上运行,为什么它根本不需要任何参数?
- 如果它实际上可以在 stdin / fds 0 1 2 以外的其他东西上工作,特别是在用户定义的伪终端上,应该如何调用它来做到这一点?