On 19 December 2010 13:43, lei yang <yanglei.f...@gmail.com> wrote:
> Right, it gets stuck at the readline(), is there a function not get
> stuck to instead of readline().

readline() will keep reading stdout until it received a newline
character. So if there is nothing to read it will wait forever. The
solution is to wait with reading until there is actually something to
read. And it is recommended [1] to use proc.communicate() instead of
reading directly from stdout.

Also you should use proc.terminate() or proc.kill() to stop the command.

Below is a modified version of your function to show what I mean.

[1] http://docs.python.org/library/subprocess.html#subprocess.Popen.stdin

Greets
Sander

def host_run(cmd, secs=10):
    print("running %s" % cmd)
    timeout = datetime.timedelta(seconds=secs)
    proc = subprocess.Popen(
        cmd,
        stdout=subprocess.PIPE,
        stderr=subprocess.STDOUT,
        shell=True)
    start = datetime.datetime.now()
    while ( proc.poll() is None and (datetime.datetime.now() - start)
< timeout): #not timed out
        print "hello,i'm here"
        sleep(1)
    if 0 == proc.poll():
        stdout, stderr = proc.communicate() #get stdout and stderr
        print("'%s' is program exited" %cmd)
        print stdout
        print stderr
    else:
        proc.terminate() #Can use proc.kill() as well
        stdout, stderr = proc.communicate() #get stdout and stderr
        print 'Timeout: Process terminated'
        print stdout
        print stderr
_______________________________________________
Tutor maillist  -  Tutor@python.org
To unsubscribe or change subscription options:
http://mail.python.org/mailman/listinfo/tutor

Reply via email to