SImple python print question

A

amit.uttam

Hey there,

I have a simple question about python print statement. Take the
following code snippet for example...

1 print "-#- executing: %s" % section,
2 tests[section] = test.testcase(name=config.get(section,'name'))
3 tests[section].runTest()
4 printStatus(tests[section])

Now the problem is that line 1 does not get printed until line 4. What
I thought would happen is that line 1 gets executed and the user sees
that the statement that the test case is executing. Then after the
test case executes a "PASS" or "FAIL" appears on the same line as the
"-#- executing: 0053" statement.

e.g.
-#- executing: 0053 FAIL

Some tests take a long time to finish thus the screen is blank until
the entire test finishes and the above statement is outputted.

Thanks for any help.

Amit
 
H

Hans Nowak

Hey there,

I have a simple question about python print statement. Take the
following code snippet for example...

1 print "-#- executing: %s" % section,
2 tests[section] = test.testcase(name=config.get(section,'name'))
3 tests[section].runTest()
4 printStatus(tests[section])

Now the problem is that line 1 does not get printed until line 4. What
I thought would happen is that line 1 gets executed and the user sees
that the statement that the test case is executing. Then after the
test case executes a "PASS" or "FAIL" appears on the same line as the
"-#- executing: 0053" statement.

e.g.
-#- executing: 0053 FAIL

Some tests take a long time to finish thus the screen is blank until
the entire test finishes and the above statement is outputted.

Thanks for any help.

'print' sends its output to sys.stdout, which is buffered, and may not be
displayed immediately (because it's held in the buffer). To force the output to
be displayed, use flush():

print "-#- executing: %s" % section,
sys.stdout.flush()
...tests here...

Hope this helps!

--Hans
 
C

Carl Banks

Hey there,

I have a simple question about python print statement. Take the
following code snippet for example...

1 print "-#- executing: %s" % section,
2 tests[section] = test.testcase(name=config.get(section,'name'))
3 tests[section].runTest()
4 printStatus(tests[section])

Now the problem is that line 1 does not get printed until line 4. What
I thought would happen is that line 1 gets executed and the user sees
that the statement that the test case is executing. Then after the
test case executes a "PASS" or "FAIL" appears on the same line as the
"-#- executing: 0053" statement.

e.g.
-#- executing: 0053 FAIL

Some tests take a long time to finish thus the screen is blank until
the entire test finishes and the above statement is outputted.


Your standard output uses line-buffering, which means that the
underlying I/O code stores all the output in memory until it gets a
newline, only then does it send the output to the terminal (or
console, or whatever).

Workarounds to this are as follows:

1. Explicity flush the buffer after any print statements that end with
a comma:

print "whatever",
sys.stdout.flush()

2. Run Python in unbuffered mode, by using the -u switch:

python -u yourscript.py


Carl Banks
 
A

amit.uttam

Hey there,
I have a simple question about python print statement. Take the
following code snippet for example...
1 print "-#- executing: %s" % section,
2 tests[section] = test.testcase(name=config.get(section,'name'))
3 tests[section].runTest()
4 printStatus(tests[section])
Now the problem is that line 1 does not get printed until line 4. What
I thought would happen is that line 1 gets executed and the user sees
that the statement that the test case is executing. Then after the
test case executes a "PASS" or "FAIL" appears on the same line as the
"-#- executing: 0053" statement.
e.g.
-#- executing: 0053 FAIL
Some tests take a long time to finish thus the screen is blank until
the entire test finishes and the above statement is outputted.
Thanks for any help.

'print' sends its output to sys.stdout, which is buffered, and may not be
displayed immediately (because it's held in the buffer). To force the output to
be displayed, use flush():

print "-#- executing: %s" % section,
sys.stdout.flush()
...tests here...

Hope this helps!

--Hans

Thanks a lot!

This worked beautifully!
 
A

amit.uttam

Hey there,
I have a simple question about python print statement. Take the
following code snippet for example...
1 print "-#- executing: %s" % section,
2 tests[section] = test.testcase(name=config.get(section,'name'))
3 tests[section].runTest()
4 printStatus(tests[section])
Now the problem is that line 1 does not get printed until line 4. What
I thought would happen is that line 1 gets executed and the user sees
that the statement that the test case is executing. Then after the
test case executes a "PASS" or "FAIL" appears on the same line as the
"-#- executing: 0053" statement.
e.g.
-#- executing: 0053 FAIL
Some tests take a long time to finish thus the screen is blank until
the entire test finishes and the above statement is outputted.

Your standard output uses line-buffering, which means that the
underlying I/O code stores all the output in memory until it gets a
newline, only then does it send the output to the terminal (or
console, or whatever).

Workarounds to this are as follows:

1. Explicity flush the buffer after any print statements that end with
a comma:

print "whatever",
sys.stdout.flush()

2. Run Python in unbuffered mode, by using the -u switch:

python -u yourscript.py

Carl Banks

Thanks for the reply. This worked as expected. I did not know about
the -u switch, this is good stuff.

Amit
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
474,201
Messages
2,571,049
Members
47,655
Latest member
eizareri

Latest Threads

Top