【发布时间】:2012-09-14 12:14:01
【问题描述】:
我想从 python 运行一个 shell 命令并使用 subprocess.Popen 接收它的输出。问题是,当我关闭进程并发送 Ctrl-C 时,我没有得到任何输出。我究竟做错了什么?代码:
>>> import subprocess
>>> sub = subprocess.Popen(["xinput", "test", "8"], stdout=subprocess.PIPE) #receive mouse events
>>> output = sub.communicate()[0].read()
^CTraceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python2.6/subprocess.py", line 693, in communicate
stdout = self.stdout.read()
KeyboardInterrupt
>>> output
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'output' is not defined
受 Jett 这篇文章的启发:
【问题讨论】:
-
发生的情况是你执行了一个 python 语句,然后通过 ctrl+C 从命令行终止它,这意味着输出没有被分配,因为异常得到引发,因此未分配输出并且您得到 NameError。通过 kill 或其他方式关闭进程而不终止 python 语句
-
@pythonm -- 或通过任何异常终止它。
-
@Bob,使用 xinput 要记住的一件事是,如果您开始从测试中读取数据,它将被缓冲,因此您只会获得其中的一部分,empty.sourceforge.net 是一种可能的解决方案,因为它是伪造的TTY 似乎需要实时输出。
-
@jett 谢谢你,但我不确定,我明白你的意思,当谈到缓冲时。谁缓冲数据,为什么我只会得到数据块?为什么我需要伪造 TTY?你建议使用
pexpect模块? – 鲍勃 -
xinput test似乎只有在连接到 TTY 时才实时输出数据,否则它将输出存储到缓冲区中,并在缓冲区填满后输出。这是进一步信息的回复。 stackoverflow.com/a/12426921/778858
标签: python subprocess stdout