在C程序中,我想运行一个Python交互式循环,它接受来自输入并输出到伪终端(例如pts / 4)不同于启动C程序的伪终端(例如pts / 1)。
运行交互式循环的基本方法是:
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并且不能使用dup'ed fds。
理想情况下,我们希望交互式循环不依赖于fds 0 1 2,并且可以在/ dev / pts / 4上运行,如下所示:
FILE *pts = fopen("/dev/pts/4", "rw");
PyRun_InteractiveLoop(pts, "/dev/pts/4");
不幸的是,这不能按预期工作,并且与使用stdin具有相同的效果,stdin默认使用启动程序的伪终端。
所以问题是双重的: