我想XINPUT的输出流进我的Python程序,但是我的程序只是等待,并保持空白。 我认为它可能有一些做缓冲,但我不能说。 运行xinput test 15
给我我的鼠标动作,但这样做不会打印。 顺便说一句,找出你的mouseid只需键入xinput
,它会列出您的设备。
#!/usr/bin/env python
import sys
import subprocess
# connect to mouse
g = subprocess.Popen(["xinput", "test", str(mouse_id)], stdout=subprocess.PIPE)
for line in g.stdout:
print(line)
sys.stdout.flush()
您的代码对我的作品; 但它看起来像xinput
如果没有连接到一个tty CMD缓冲输出。 当运行代码,不断地移动鼠标,并最终xinput
应该清空标准输出,你会看到你的行块露面......至少我运行代码时一样。
我重新写你的代码,以消除缓冲,但我无法得到它没有大块出来,因此为什么我相信xinput
是难辞其咎的。 当未连接到TTY,它不与冲洗每个新事件的标准输出缓冲器。 这可以通过验证xinput test 15 | cat
xinput test 15 | cat
。 移动你的鼠标会导致数据的缓冲块打印; 就像你的代码。
我的测试代码如下,如果有帮助
#!/usr/bin/python -u
# the -u flag makes python not buffer stdios
import os
from subprocess import Popen
_read, _write = os.pipe()
# I tried os.fork() to see if buffering was happening
# in subprocess, but it isn't
#if not os.fork():
# os.close(_read)
# os.close(1) # stdout
# os.dup2(_write, 1)
#
# os.execlp('xinput', 'xinput', 'test', '11')
# os._exit(0) # Should never get eval'd
write_fd = os.fdopen(_write, 'w', 0)
proc = Popen(['xinput', 'test', '11'], stdout = write_fd)
os.close(_write)
# when using os.read() there is no readline method
# i made a generator
def read_line():
line = []
while True:
c = os.read(_read, 1)
if not c: raise StopIteration
if c == '\n':
yield "".join(line)
line = []
continue
line += c
readline = read_line()
for each in readline:
print each
看看SH ,特别是本教程http://amoffat.github.com/sh/tutorials/1-real_time_output.html
import sh
for line in sh.xinput("test", mouse_id, _iter=True):
print(line)