我正在尋求從外部進程向現有進程的STDIN
寫入數據的方法,並在stackoverlow中發現了類似的問題How do you stream data into the STDIN of a program from different local/remote processes in Python?。如何從外部進程將數據寫入現有進程的STDIN?
在該線程中,@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() + "]")
行?
命名管道(請參見man mkfifo')做你想要的嗎? – Andy 2011-03-21 16:05:11
感謝您的建議。我會看看named-pipe。 – mooz 2011-03-21 18:20:47