如何从外部流程将数据写入现有流程的STDIN?
我正在寻找STDIN
从外部流程将数据写入现有流程的方法,
@Michael在该线程中说,我们可以在如下所示的路径中获取现有进程的文件描述符,并允许在Linux上将数据写入它们。
/proc/$PID/fd/
因此,我创建了下面列出的简单脚本,以测试将数据从外部进程写入脚本STDIN
(和TTY
)的过程。
#!/usr/bin/env pythonimport 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() + "]")从其他进程调用该行的执行?
回答:
您的代码将无法正常工作。
/proc/pid/fd/0
是/dev/pts/6
文件的链接。
$ echo’foobar’> / dev / pts / 6
$ echo’foobar’> / proc / pid / fd / 0
由于这两个命令均写入终端。此输入将转到终端,而不是进程。
如果stdin最初是管道,它将起作用。
例如,test.py
是:
#!/usr/bin/pythonimport 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
以上是 如何从外部流程将数据写入现有流程的STDIN? 的全部内容, 来源链接: utcz.com/qa/415713.html