I have the following small python script to run a local server for testing some html:
print(\'opened\')
from http.server import HTTPServer, SimpleHTTPReques
import logging
logging.info('Listening at https://127.0.0.1:8000/ . . .')
Hi, please, consider using logging instead of printing, you do not want bother with all the shortcomings of the print statement. Print is for beginners, may be for interactive mode. All the professional server-side coders rely on logging.
Check In python, why use logging instead of print? for the full list of logging goodness.
There several solutions for this phenomena:
Reopen stdout file descriptor with write mode, and 0 as the buffer size (unbuffered). I suggest to write this line as the first line in your code, and this way, all your code will remain the same except the stdout
buffer:
sys.stdout = os.fdopen(sys.stdout.fileno(), 'w', 0)
Force the binary layer of the stdout and stderr streams (which is available as their buffer attribute) to be unbuffered. The text I/O layer will still be line-buffered if writing to the console, or block-buffered if redirected to a non-interactive file.
So just run your script like this:
python -u <your_pyScript>
Or by setting the environment variable PYTHONUNBUFFERED
flush
keyword argument to trueSince Python 3.3, you can force the normal print()
function to flush without the need to use sys.stdout.flush()
just set the "flush" keyword argument to true:
print("...", flush=True)
flush=True
You can change the default for the print function by using functools.partial
on the global scope of a module:
import functools
print = functools.partial(print, flush=True)
We can see it works just as expected:
>>> print('foo')
foo
That maybe related with the "infamous" need to flush in order for your prints to work!
Related reading material:
flush
which by default is False
. Do:
print('opened', flush=True)
from http.server import HTTPServer, SimpleHTTPRequestHandler
server_address = ('', 8000)
httpd = HTTPServer(server_address, SimpleHTTPRequestHandler)
print('Listening at https://127.0.0.1:8000/ . . .', flush=True)
httpd.serve_forever()
PS: This is a confirmed solution on a similar issue