我正在寻找从外部进程向现有进程的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
(或其他文件描述符),即从其他进程调用行print("read :: [" + sys.stdin.readline() + "]")
的执行?
发布于 2015-09-18 11:24:08
我想在这里留下一个我认为有用的例子。这是对上面的while true技巧的轻微修改,它在我的机器上间歇性地失败。
# 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
,它非常适合这个场景。
https://stackoverflow.com/questions/5374255
复制相似问题