【发布时间】:2011-07-19 10:58:28
【问题描述】:
我正在寻找将数据从外部进程写入现有进程的STDIN 的方法,并在stackoverlow 中发现了类似的问题How do you stream data into the STDIN of a program from different local/remote processes in Python?。
在那个线程中,@Michael 说我们可以在如下路径中获取现有进程的文件描述符,并允许在 Linux 上将数据写入其中。
/proc/$PID/fd/
因此,我创建了一个下面列出的简单脚本,以测试从外部进程将数据写入脚本的STDIN(和TTY)。
#!/usr/bin/env python
import os, sys
def get_ttyname():
for f in sys.stdin, sys.stdout, sys.stderr:
if f.isatty():
return os.ttyname(f.fileno())
return None
if __name__ == "__main__":
print("Try commands below")
print("$ echo 'foobar' > {0}".format(get_ttyname()))
print("$ echo 'foobar' > /proc/{0}/fd/0".format(os.getpid()))
print("read :: [" + sys.stdin.readline() + "]")
此测试脚本显示STDIN 和TTY 的路径,然后等待写入STDIN。
我启动了这个脚本并收到了下面的消息。
Try commands below
$ echo 'foobar' > /dev/pts/6
$ echo 'foobar' > /proc/3308/fd/0
所以,我从其他终端执行了命令echo 'foobar' > /dev/pts/6 和echo 'foobar' > /proc/3308/fd/0。在执行这两个命令后,消息foobar 会在运行测试脚本的终端上显示两次,但仅此而已。 print("read :: [" + sys.stdin.readline() + "]") 行没有被执行。
有没有办法将数据从外部进程写入现有进程的STDIN(或其他文件描述符),即从其他进程调用 lineprint("read :: [" + sys.stdin.readline() + "]") 的执行?
【问题讨论】:
-
命名管道(见
man mkfifo)会做你想做的事吗? -
感谢您的建议。我来看看命名管道。
标签: linux process stdin file-descriptor tty