使在 shell 终端中运行的 Python 脚本从另一个 shell 实例读取 stdin

问题描述 投票:0回答:1

我有一个 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 ,但我无法理解如何在我的脚本中实际使用它。实现这个的正确方法是什么?

python shell ipc
1个回答
0
投票

/proc/41267/fd/0
是终端设备。当您从中读取时(在 script1 中),您是从终端读取的。当你写入它时(在 script2 中),你就写入了终端。不是你想要的。


要以所需的方式连接两个脚本,您需要具有“两端”的东西。其中之一:

  • 管道 - 它要求您从一个父进程启动两个脚本,因为描述符是继承的。
  • 套接字对 - 类似于管道,但管道是单向的,而套接字对是双向的
  • 命名管道(又名 FIFO),类似于管道,但每个脚本可以独立打开它
  • 伪终端 - 这是一种矫枉过正,你不需要控制终端功能、进程组、会话等,对吗?
  • Unix 域套接字 - 就像本地 TCP
  • TCP 连接,可以通过 LAN 甚至互联网进行通信

这是一个简单的演示。使用

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) 
© www.soinside.com 2019 - 2024. All rights reserved.