gpt4 book ai didi

python - 重定向 Python 解释器的 IO

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:23:58 24 4
gpt4 key购买 nike

我编写了一个简单的调试器程序,它可以执行控制台程序并将其输出发送到“out”和“err”文件,并从“in”文件中检索其输入。现在,我想扩展它的功能以运行 Python 脚本。为此,我想我可以让调试器只运行 Python 解释器并将 Python 解释器与文件连接起来。

但是当我在调试器中运行 Python 解释器时,我看不到任何与正常程序相同的输出。调试器有非常详细的错误记录,我在错误日志文件中没有看到任何错误。

我使用了“ps -A”,看起来调试器确实启动了 Python 解释器,原因有两个:1) 进程 ID 相差一个,2) 一旦我 kill -9 python,调试器就会退出解释器(说明文件描述符已连接)。这是 ps -All 的输出:

1 R     0  1565     1 88  80   0 -  1040 -      pts/0    00:01:45 debugger
0 S 0 1566 1565 0 80 0 - 7782 pipe_w pts/0 00:00:00 python.out

调试器是这样启动的(python.out 是 python 解释器的副本):

debugger python.out

所以我想我的问题是,有人知道为什么这不起作用吗? Python 解释器会对其标准文件描述符做任何奇怪的事情吗?

编辑:

  • 我还注意到 python.out 无法使用 python.out > out_file 重定向其 IO - 这可能与调试器遇到的问题有关,也可能无关。

  • 调试器不使用 block 缓冲。

  • 这是来自/proc/pid/io 的一些 io 信息:

调试器(我将一些长度为 21 的数据写入“in”文件)

rchar: 21
wchar: 21
syscr: 300222462
syscw: 1
read_bytes: 0
write_bytes: 0
cancelled_write_bytes: 0

Python 解释器

rchar: 517268
wchar: 0
syscr: 93
syscw: 0
read_bytes: 0
write_bytes: 0
cancelled_write_bytes: 0

最佳答案

Python 解释器的 pipe_w 等待状态是一个赠品:它无法运行,因为它正在尝试从空管道读取或写入完整管道。

在您的代码和/或解释器中使用了 block 缓冲,但您没有向我们展示足够的信息来判断是哪一个。

为回应评论而添加:

您认为您没有使用 block 缓冲,但 stdio 库可能在您不知情的情况下执行此操作。考虑简单的:

main()
{
puts("print ('hello, world!')\n");
sleep(3600);
}

当您从终端运行它时,它会在终端上打印 print ('hello, world!') 然后休眠一个小时,正如您所期望的那样。这是因为 stdio 库检测到 stdout 是一个终端,并在每个换行符上对其缓冲区执行 write()。它这样做是因为人们喜欢在准备就绪时看到行缓冲输出。但是,如果您将此程序的输出通过管道传输到 python 中,终端将在一小时内不会显示任何内容;这是因为 stdio 库发现 stdout 是一个管道并切换到 block 缓冲模式。在 block 缓冲模式下,stdio 将等待直到它有 BUFSIZ 个字符要写入,并且在现代机器上 BUFSIZ 为 4096 或更大。

当你说“我可以确认调试器正在读取我传递给它的输入”时,由于 stdio 的这种模式切换,你在终端上测试你的调试器实际上并没有告诉你进程间通信是否正常缓冲与否。 ps 的输出表明它正在缓冲。参见 setvbuf了解如何控制缓冲。

或者您可以显示您的代码而不是无用的/proc/n/io。我的 python 报告:

rchar: 288789
wchar: 0
syscr: 108
syscw: 0
read_bytes: 0
write_bytes: 0
cancelled_write_bytes: 0

但它仍然没有给出任何输出,并且直到时间结束才会输出,因为它的 /proc/n/wchan

pipe_wait

正如预期的那样。

关于python - 重定向 Python 解释器的 IO,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16379964/

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