Django management command doesn't flush stdout

The thing to keep in mind is you're using self.stdout (as suggested in the Django docs), which is BaseCommand's override of Python's standard sys.stdout. There are two main differences between the 2 relevant to your problem:

  1. The default "ending" in BaseCommand's version of self.stdout.write() is a new-line, forcing you to use the ending='' parameter, unlike sys.stdout.write() that has an empty ending as the default. This in itself is not causing your problem.
  2. The BaseCommand version of flush() does not really do anything (who would have thought?). This is a known bug:

So you really have 2 options:

  1. Not use BaseCommand's self.stdout but instead use sys.stdout, in which case the flush does work
  2. Force the stdout to be totally unbuffered while running the management command by passing the "-u" parameter to python. So instead of running python <subcommand>, run python -u <subcommand>

Hope this helps.