Windows 上损坏的自定义 Django 管理命令

Custom Django management commands broken on Windows

我目前正在努力从 django 1.3 升级到 1.8。我的应用程序现在正在 Ubuntu (Ubuntu 16.04) 上运行,但是 Windows 版本有问题。

当我在 Windows 上 运行 我的自定义管理命令时,会生成以下错误:

Traceback (most recent call last):
  File "D:\src\proj\grp\tests\test_list_members.py", line 29, in setUp
call_command('syncgroups')
  File "D:\src\env\lib\site-packages\django\core\management\__init__.py", line 103, in call_command
parser = command.create_parser('', name)
  File "D:\src\env\lib\site-packages\django\core\management\base.py", line 316, in create_parser
help='Verbosity level; 0=minimal output, 1=normal output, 2=verbose output, 3=very verbose output')
  File "C:\Python27\Lib\optparse.py", line 1018, in add_option
raise TypeError, "invalid arguments"
TypeError: invalid arguments

我已经找到问题的根源,__future__.unicode_literals 在 Windows 和 Ubuntu 上的处理似乎不同。例如,以下适用于 Ubuntu 但不适用于 Windows(与上面相同的 TypeError 错误)

from __future__ import unicode_literals
from optparse import OptionParser

OptionParser().add_option('-v', '--verbose')

这是否意味着 Django 1.8 不再支持 Windows 上的自定义管理命令?

任何解决方法将不胜感激!

问题是我的 Windows 机器上安装的 OptionParser 版本没有更新以正确支持 Unicode。更新我的 python 安装是最好的解决方案,但也可以使用临时解决方法。

对 %PYTHONHOME%\Lib\optparse.py 进行以下更改解决了这个问题...

1006    ...
1007    def add_option(self, *args, **kwargs):
1008        """add_option(Option)
1009           add_option(opt_str, ..., kwarg=val, ...)
1010        """
    +-      if type(args[0]) in types.StringTypes:
1012            option = self.option_class(*args, **kwargs)
1013        elif len(args) == 1 and not kwargs:
1014            option = args[0]
1015    ...