我有一个 python 脚本,它在提供时读取和输入,并对输入执行某些操作(请参阅下面的 process_input):
import sys
def process_input(input_data):
# logic to process the input data
print(f"Processed input: {input_data}")
return 1 # Return 1 to increment the counter
if __name__ == "__main__":
input_count = 0
while True:
try:
input_data = sys.stdin.readline().strip()
if input_data == "exit":
break
input_count += process_input(input_data)
print(f"Input count: {input_count}")
except (KeyboardInterrupt, EOFError):
break
现在我希望能够将输入从另一个 shell 脚本 (bash) 传递到这个 python 脚本(我将在终端中执行)。
我怎样才能实现这个目标?
到目前为止我尝试了以下方法:
1.I started the python program
2. I found the PID using ps -xv command
3. I tried redirecting a simple echo input from another terminal using:
echo "some text" > /proc/41267/fd/0
其中 41267 是 PID
这些操作的结果是python程序运行的终端打印了echo文本,但它不执行process_input函数。 我阅读了这篇相关文章https://unix.stackexchange.com/questions/385771/writing-to-stdin-of-a-process,据我所知,问题是我将标准输入重定向到伪-终端。
在其中一条评论中提到使用 mkfifo ,但我无法理解如何在我的脚本中实际使用它。实现这个的正确方法是什么?
/proc/41267/fd/0
是终端设备。当您从中读取时(在 script1 中),您是从终端读取的。当你写入它时(在 script2 中),你就写入了终端。不是你想要的。
要以所需的方式连接两个脚本,您需要具有“两端”的东西。其中之一:
这是一个简单的演示。使用
mkfifo /tmp/example-fifo
(shell 命令)或在 Python 中使用 os.mkfifo(...)
创建 FIFO 特殊文件。完成后移除 FIFO。在现实世界中,您还应该使其他用户无法访问 FIFO。
FIFO = '/tmp/example-fifo'
with open(FIFO) as inp:
while line := inp.readline():
print(f"got: {line.rstrip()}")
作者:
FIFO = '/tmp/example-fifo'
TEXT = """\
hello world
line #2
good bye cruel world, I'm leaving you today
"""
with open(FIFO, "w") as outp:
outp.write(TEXT)