gpt4 book ai didi

python - 如何将一个 python 脚本的输出通过管道传输到另一个 python 脚本

转载 作者:太空狗 更新时间:2023-10-30 01:32:09 25 4
gpt4 key购买 nike

<分区>

我在将一个脚本的输出通过管道传输到另一个脚本时遇到了困难(都是 Python)。

question非常相似,但(1)它没有提供答案(2)我的略有不同。所以,我认为打开一个新问题会更好。

问题来了。
这两个脚本几乎相同:

receiver.py

import sys
import time

for line in sys.stdin:
sys.stdout.write(line)
sys.stdout.flush()
time.sleep(3)

复制器.py

import sys
import time

for line in sys.stdin:
sys.stderr.write(line)
sys.stderr.flush()
time.sleep(3)

当我在 bashcmd 中一个一个地执行这些脚本时,一切都很好。下面的两个示例都有效,我在输出中看到了输入文本:

有效:(每 3 秒出现一行输出)

cat data.txt | python receiver.py
cat data.txt | python replicator.py

但是一旦我从一个脚本传输到另一个脚本,它们就会停止工作:

不起作用:(在到达文件末尾之前不显示任何内容)

cat data.txt | python receiver.py | python replicator.py

然后,当我将第一个脚本通过管道传输到另一个工具时,它又可以工作了!

作品:

cat data.txt | python receiver.py | cat -n
cat data.txt | python replicator.py | cat -n

最后,当我删除阻塞的 sleep() 函数时,它又开始工作了:

删除计时器:

time.sleep(0)

现在可以了:

cat data.txt | python receiver.py | python replicator.py

有人知道我的管道有什么问题吗?我不是在寻找其他方法来做到这一点。我只想了解这里发生了什么。

更新

根据评论,我完善了示例。
现在这两个脚本不仅打印出 data.txt 的内容,而且还为每一行添加了时间戳。

receiver.py

import sys
import time
import datetime

for line in sys.stdin:
sys.stdout.write(str(datetime.datetime.now().strftime("%H:%M:%S"))+'\t')
sys.stdout.write(line)
sys.stdout.flush()
time.sleep(1)

数据.txt

Line-A
Line-B
Line-C
Line-D

结果

$> cat data.txt
Line-A
Line-B
Line-C
Line-D

$> cat data.txt | python receiver.py
09:05:44 Line-A
09:05:45 Line-B
09:05:46 Line-C
09:05:47 Line-D

$> cat data.txt | python receiver.py | python receiver.py
09:05:54 09:05:50 Line-A
09:05:55 09:05:51 Line-B
09:05:56 09:05:52 Line-C
09:05:57 09:05:53 Line-D

$> cat test.log | python receiver.py | sed -e "s/^/$(date +"%H:%M:%S") /"
09:17:55 09:17:55 Line-A
09:17:55 09:17:56 Line-B
09:17:55 09:17:57 Line-C
09:17:55 09:17:58 Line-D

$> cat test.log | python receiver.py | cat | python receiver.py
09:36:21 09:36:17 Line-A
09:36:22 09:36:18 Line-B
09:36:23 09:36:19 Line-C
09:36:24 09:36:20 Line-D

如您所见,当我将 python 脚本的输出通过管道传递给自身时,第二个脚本会一直等到第一个脚本完成。然后它开始消化数据。

但是,当我使用另一个工具(本例中为 sed)时,该工具会立即接收数据。为什么会这样?

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