您好我有这样的问题,我需要执行一些命令并等待它的输出,但在读取输出之前我需要将\n
写入管道。这是unitest,所以在某些情况下命令我测试不要回答,我的测试用例停在stdout.readline()
并等待smth。所以我的问题是,是否可以将超时设置为读取线。
cmd = ['some', 'list', 'of', 'commands']
fp = subprocess.Popen(cmd, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
fp.stdin.write('\n')
fp.stdout.readline()
out, err = fp.communicate()
答案 0 :(得分:1)
等待响应的时间不超过一秒:
from subprocess import Popen, PIPE
p = Popen(['command', 'the first argument', 'the second one', '3rd'],
stdin=PIPE, stdout=PIPE, stderr=PIPE,
universal_newlines=True)
out, err = p.communicate('\n', timeout=1) # write newline
通过3.2+子进程模块的http://pypi.python.org/pypi/subprocess32/后端,Python 2.x上提供了超时功能。请参阅subprocess with timeout。
对于使用线程,signal.alarm,select,iocp,twisted或仅是临时文件的解决方案,请参阅您问题下相关帖子的链接。
答案 1 :(得分:0)
您直接将输入传递给来自文档
的通信https://docs.python.org/2/library/subprocess.html#subprocess.Popen.communicate与流程交互:将数据发送到stdin。从stdout和。读取数据 stderr,直到达到文件结尾。等待进程终止。 可选的输入参数应该是要发送给子级的字符串 如果没有数据应该发送给孩子,则处理或无。
示例:
cmd = ['some', 'list', 'of', 'commands']
fp = subprocess.Popen(cmd, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
out, err = fp.communicate('\n')