python subaccess模块的简单用法
singlesp的Python项目详细描述
单个子流程使用模块。
作者:Moises P.Senamoisespsena@gmail.com
许可证:麻省理工学院
示例
fromsinglespimport*
实例化
p=Proc('date')# orp=Proc(['echo',__file__])
标准输出
对于setstdout回调,请使用>运算符。
print(p.read())# orprint(p.wait().read())# orprint(p.run().wait().read())defcb_out(proc):forlineinproc.out:print("STDOUT: %r"%line)Proc('date',callbacks=[cb_out]).wait()defcb_outreader(reader):forlineinreader:print("STDOUT: %r"%line)(Proc('date')>cb_outreader).wait()# orp=Proc('date')>cb_outreaderp.wait()
缓冲区
defcb_outreader(reader):fordatainreader(10):print("STDOUT: %r"%data)(Proc('date')>cb_outreader).wait()
标准差
对于setstderr回调,请使用>>运算符。
defcb_errreader(reader):fordatainreader:print("ERR: %r"%data)(Proc('date')>>cb_outreader).wait()
stdout和stderr回调
defcbo(reader):fordatainreader:print("OUT: %r"%data)defcbe(reader):fordatainreader:print("ERR: %r"%data)(Proc('echo out data;echo err data >&2;')>cbo>>cbe).wait()
回调
# async read stdout and stderrdefcb_stdout(proc):forlineinproc.out:print("STDOUT: %r"%line)defcb_stderr(proc):forlineinproc.err:print("STDERR: %r"%line)Proc('seq 1 3 | while read l; do echo "i= $l"; echo "i in err: $l" >&2; done',callbacks=[cb_stdout,cb_stderr]).wait()
许多命令是异步的
Proc('echo CMD-1: first command with sleep 1; sleep 1; echo CMD-1: done',callbacks=[cb_stdout,cb_stderr]).run()Proc('echo CMD-2: show date; date; echo CMD-2: done',callbacks=[cb_stdout,cb_stderr]).run()# wait all callbacksprint("before wait")wait()print("done")
< H2>获取退出状态
p=Proc('date').run().wait()# or p = Proc('date').wait()print(p.status)
管道
简单:
(Input(['God ','is ','Love!!'])|Proc(['cat'])).read()defcb_stdout(reader):forlineinreader:print("STDOUT: %r"%line)p=Proc('seq 1 3')|Proc('grep 2')>cb_stdout# or p = Proc('seq 1 3').pipe(Proc('grep 2')) > cb_stdoutp.run()wait()print(Input(['God ','is ','Love!!'])|Proc(['cat'])).read()defgen():yield'God 'yield'is 'yield'Love!!'print(Input(gen())|Proc(['cat'])).read()print(Commands(['date'])|Proc(['bash'])).read()print(Commands(['date'])|bash()).read()print(Commands(['date'])|sh()).read()wait()
简单:
p=Proc('seq 1 3')|Proc('grep 2')>cb_stdoutp.run()wait()
复杂:
defcb_stdout(proc):forlineinproc.out:print("STDOUT: %r"%line)defa_stderr(proc):forlineinproc.err:print("A-STDERR: %r"%line)defb_stderr(proc):forlineinproc.err:print("B-STDERR: %r"%line)p=Proc('echo "[A] error message" >&2;seq 1 3',callbacks=[a_stderr])| \ Proc('while read l; do echo "i= $l"; echo "[B] i in err: $l" >&2; done',callbacks=[cb_stdout,b_stderr])p.run()wait()