斯隆
sopen的Python项目详细描述
什么是sopen?
sopen是一个简单的python2和python3兼容的包,它包装了python的 Popen。sopen力争成为linux和windows中都可用的跨平台库。
sopen以两种方式之一运行shell命令:
- “blocking”模式,在shell命令完成之前阻塞。
- “非阻塞”模式,允许用户在命令运行时查看其输出。
sopen的主要目标是简单。用户不需要考虑管道、队列、线程或使用Popen时出现的任何其他问题(特别是在非阻塞用例中)。
与任何事物一样,简单与折衷并存:
阻塞模式使用
这将捕获grep的输出并将其打印到stdout…
fromsopenimportSopen# This blocks until the output of the grep finishes...proc=Sopen('grep foo bar.txt',mode='blocking')forlineinproc.stdout.read().splitlines():print(line)
非阻塞模式使用
非阻塞模式最适合流式输出不间断的命令,或者您可能希望实时响应的进程。此示例捕获ping命令的输出(五个ping)并将其打印到stdout…
fromsopenimportSopenping_addrs='127.0.0.1'proc=Sopen('ping -c 5 -O {0}'.format(ping_addrs),mode='nonblocking')finished=Falsewhilenotfinished:# readline_stdout() is only available in nonblocking mode# The timeout parameter tells sopen how long to wait for output;# if there is no output before the timeout, None is returned.out=proc.readline_stdout(timeout=0.001)err=proc.readline_stderr(timeout=0.001)if(outisnotNone):print("{}".format(out))if(errisnotNone):print("ERROR {}".format(err))ifproc.stdout_doneandproc.stderr_done:finished=True
sopen真正闪耀的地方是需要生成许多流shell命令并同时监视它们。
下面的示例将同时ping四个地址,并为所有地址打印输出。
fromsopenimportSopenping_addrs=['127.0.0.1','127.0.0.2','127.0.0.3','127.0.0.4']procs=dict()# Spawn pings for all addressesforaddrinping_addrs:proc=Sopen('ping -A -O {0}'.format(addr),mode='nonblocking')procs[addr]=procwhileTrue:foraddr,procinprocs.items():out=proc.readline_stdout(timeout=0.001)err=proc.readline_stderr(timeout=0.001)if(outisnotNone):print("{}".format(out))if(errisnotNone):print("ERROR {}".format(err))