1

xinput の出力を Python プログラムにストリーミングしようとしていますが、プログラムは待機して空白のままになります。バッファリングと関係があるのではないかと思いますが、なんとも言えません。実行xinput test 15するとマウスの動きが得られますが、これを実行しても印刷されません。ちなみに、マウス ID を調べるには、入力するだけ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()    
4

2 に答える 2

2

あなたのコードは私のために働きます。xinputただし、ttyに接続されていない場合、cmdは出力をバッファリングするように見えます。コードを実行しているときは、マウスを動かし続けると、最終的にxinputstdoutがフラッシュされ、行がチャンクで表示されます...少なくともコードを実行しているときはそうしました。

バッファリングを排除するためにコードを書き直しましたが、チャンクで出てこないようにすることができなかったので、なぜ私xinputは責任があると信じています。TTYに接続されていない場合、新しいイベントごとにstdoutバッファーをフラッシュしません。これはで確認できます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
于 2012-09-14T14:50:35.310 に答える
2

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)
于 2012-09-14T20:50:01.127 に答える