12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152 |
- #!/usr/bin/python
- # -*- coding: utf-8 -*-
- import sys, shlex, time, subprocess
- cmd = "./python.subprocess 0 80000"
- args = shlex.split(str(cmd))
- print "cmd: %s, args: %s"%(cmd, args)
- # the communicate will read all data and wait for sub process to quit.
- def use_communicate(args, fout, ferr):
- process = subprocess.Popen(args, stdout=fout, stderr=ferr)
- (stdout_str, stderr_str) = process.communicate()
- return (stdout_str, stderr_str)
- # if use subprocess.PIPE, the pipe will full about 50KB data,
- # and sub process will blocked, then timeout will kill it.
- def use_poll(args, fout, ferr, timeout):
- (stdout_str, stderr_str) = (None, None)
- process = subprocess.Popen(args, stdout=fout, stderr=ferr)
- starttime = time.time()
- while True:
- process.poll()
- if process.returncode is not None:
- (stdout_str, stderr_str) = process.communicate()
- break
- if timeout > 0 and time.time() - starttime >= timeout:
- print "timeout, kill process. timeout=%s"%(timeout)
- process.kill()
- break
- time.sleep(1)
- process.wait()
- return (stdout_str, stderr_str)
- # stdout/stderr can be fd, fileobject, subprocess.PIPE, None
- fnull = open("/dev/null", "rw")
- fout = fnull.fileno()#subprocess.PIPE#fnull#fnull.fileno()
- ferr = fnull.fileno()#subprocess.PIPE#fnull#fnull.fileno()
- print "fout=%s, ferr=%s"%(fout, ferr)
- #(stdout_str, stderr_str) = use_communicate(args, fout, ferr)
- (stdout_str, stderr_str) = use_poll(args, fout, ferr, 10)
- def print_result(stdout_str, stderr_str):
- if stdout_str is None:
- stdout_str = ""
- if stderr_str is None:
- stderr_str = ""
- print "terminated, size of stdout=%s, stderr=%s"%(len(stdout_str), len(stderr_str))
- while True:
- time.sleep(1)
- print_result(stdout_str, stderr_str)
|