如何从外部进程将数据写入现有进程的STDIN?

我正在寻找从外部进程向现有进程的STDIN写入数据的方法,并发现了类似的问题如何将数据stream式传输到来自Python中不同本地/远程进程的程序的STDIN中? 在stackoverlow中。

在这个线程中,@Michael说我们可以像下面那样获取现有进程的文件描述符,并允许在Linux上写入数据。

 /proc/$PID/fd/ 

所以,我创build了一个下面列出的简单脚本来testing从外部进程向脚本的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() + "]") 

这个testing脚本显示STDINTTYpath,然后等待一个写它的STDIN

我启动了这个脚本,在下面得到消息。

 Try commands below $ echo 'foobar' > /dev/pts/6 $ echo 'foobar' > /proc/3308/fd/0 

所以,我执行命令echo 'foobar' > /dev/pts/6并从其他terminalecho 'foobar' > /proc/3308/fd/0 。 执行完这两个命令之后,在testing脚本运行的terminal上显示消息foobar两次,但是就这些了。 行print("read :: [" + sys.stdin.readline() + "]")没有执行。

有没有办法从外部进程写入数据到现有进程的STDIN (或其他文件描述符),即调用执行行print("read :: [" + sys.stdin.readline() + "]")其他进程?

Solutions Collecting From Web of "如何从外部进程将数据写入现有进程的STDIN?"

您的代码将无法正常工作。
/proc/pid/fd/0是到/dev/pts/6文件的链接。

$ echo'foobar'> / dev / pts / 6
$ echo'foobar'> / proc / pid / fd / 0

由于这两个命令都写入终端。 这个输入到达终端而不是进程。

它会工作,如果标准输入是一个管道。
例如, test.py是:

 #!/usr/bin/python import os, sys if __name__ == "__main__": print("Try commands below") print("$ echo 'foobar' > /proc/{0}/fd/0".format(os.getpid())) while True: print("read :: [" + sys.stdin.readline() + "]") pass 

运行这个:

 $ (while [ 1 ]; do sleep 1; done) | python test.py 

现在从另一个终端写入/proc/pid/fd/0 ,它会来test.py

我想在这里留下一个我觉得有用的例子。 这是一个微小的修改,而上面的那个间歇性地在我的机器上失败的技巧。

 # pipe cat to your long running process ( cat ) | ./your_server & server_pid=$! # send an echo to your cat process that will close cat and in my hypothetical case the server too echo "quit\n" > "/proc/$server_pid/fd/0" 

这对我很有帮助,因为我不能使用mkfifo ,这对于这个场景来说是完美的。