如何从外部进程将数据写入现有进程的STDIN?
我正在寻求从外部进程向现有进程的STDIN
写入数据的方法,并发现了类似的问题如何在Python中将数据stream式传输到来自不同本地/远程进程的程序的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脚本显示STDIN
和TTY
path,然后等待一个写它的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() + "]")
其他进程?
您的代码将无法正常工作。
/proc/pid/fd/0
是到/dev/pts/6
文件的链接。
$ echo'foobar'> / dev / pts / 6
$ echo'foobar'> / proc / pid / fd / 0
由于这两个命令都写入terminal。 这个input到达terminal而不是进程。
它会工作,如果标准input是一个pipe道。
例如, 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
现在从另一个terminal写入/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
,这对于这个场景来说是完美的。