Opened 5 years ago

Closed 2 years ago

Last modified 2 years ago

#21933 closed Uncategorized (invalid)

UnicodeDecodeError when writing unicode to stdout of management command

Reported by: synotna Owned by: nobody
Component: Uncategorized Version: 1.8
Severity: Normal Keywords:
Cc: Triage Stage: Unreviewed
Has patch: no Needs documentation: no
Needs tests: no Patch needs improvement: no
Easy pickings: no UI/UX: no

Description (last modified by Darren Hobbs)

In a management command, if you include unicode characters when writing to stdout (with self.stdout.write) you will get a UnicodeDecodeError

This happens even if the system locale is utf-8, and self.stdout.encoding is utf-8, and you .decode(self.stdout.encoding,'replace')

A workaround is to always .decode() to ascii, and if that is what should be done it should be documented at https://docs.djangoproject.com/en/dev/howto/custom-management-commands/

/myapp/management/commands/unicode_test.py

# -*- coding: utf-8 -*-
from django.core.management.base import BaseCommand

class Command(BaseCommand):
    args = '<none>'
    help = 'Do something'

    def handle(self, *args, **options):
        output = u'Σάββα▒^▒ο'
        self.stdout.write('Output: {}'.format(output))
Traceback (most recent call last):
  File "manage.py", line 10, in <module>
    execute_from_command_line(sys.argv)
  File "/home/tech/.pyenv/versions/esldj-all-in-one-2.7.6/lib/python2.7/site-packages/django/core/management/__init__.py", line 399, in execute_from_command_line
    utility.execute()
  File "/home/tech/.pyenv/versions/esldj-all-in-one-2.7.6/lib/python2.7/site-packages/django/core/management/__init__.py", line 392, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/home/tech/.pyenv/versions/esldj-all-in-one-2.7.6/lib/python2.7/site-packages/django/core/management/base.py", line 242, in run_from_argv
    self.execute(*args, **options.__dict__)
  File "/home/tech/.pyenv/versions/esldj-all-in-one-2.7.6/lib/python2.7/site-packages/django/core/management/base.py", line 285, in execute
    output = self.handle(*args, **options)
  File "/home/tech/esldj/all-in-one/go4/management/commands/unicode_test.py", line 10, in handle
    self.stdout.write('Output: {}'.format(output))
  File "/home/tech/.pyenv/versions/esldj-all-in-one-2.7.6/lib/python2.7/site-packages/django/core/management/base.py", line 65, in write
    if ending and not msg.endswith(ending):

Change History (5)

comment:1 Changed 5 years ago by Claude Paroz

Resolution: invalid
Status: newclosed

Your output attribute in the above code example should be prefixed by u.

comment:2 Changed 2 years ago by Darren Hobbs

Description: modified (diff)
Resolution: invalid
Status: closednew
Version: 1.61.8

comment:3 Changed 2 years ago by Darren Hobbs

Updated code as per the comment - this issue still exists.

comment:4 Changed 2 years ago by Darren Hobbs

Resolution: invalid
Status: newclosed

My bad - the issue does exist, but the example code here doesn't properly demonstrate it.

comment:5 Changed 2 years ago by Tim Graham

The follow up ticket is #26731.

Note: See TracTickets for help on using tickets.
Back to Top