1

我在 django 中有一个自定义命令,它调用另一个脚本,如下所示:

import script

from optparse import make_option
from django.core.management.base import BaseCommand

class Command(BaseCommand):

    option_list = BaseCommand.option_list + (
        make_option(
            "-f", 
            "--files", 
            dest = "files",
            help = "add files to list",
            action='store_true',
            default=False
        ),

        # Some more options here
    )

    def handle(self, *args, **options):
        script.main(files=options['files'])

我的自定义脚本也使用optparse. 它看起来像这样。

from optparse import OptionParser

opts = OptionParser()
opts.add_option('-f', '--files', dest='files', action='store_true', default=false, help='file help message')
opts = opts.parse_opts()[0]

FILE = opts.file

def main(files=false):
    opts.files = files
    # Do the processing

现在,当我尝试运行 commandpython manage.py command --option-other-than-file时,它总是仅打印帮助消息,--help并且--file作为选项。此外,选项的帮助消息--files是在导入脚本中定义的,而不是在命令文件中定义的。此外,当我尝试使用python manage.py command --help它打印选项时,也会显示相同的消息。似乎有些选项被覆盖了。有人可以告诉我发生了什么事。谢谢。

编辑

这是BaseCommand类的代码

4

1 回答 1

1

当您第一次import script使用命令时,它会执行顶层的所有代码script.py,包括该opts.parse_opts()行。我不认为 optparse 应该允许在同一进程中进行两次这样的连续调用。

只需将您的script.pyoptparse 部分移动到一个if __name__ == '__main__':子句中,这样在将其用作模块时它就不会触发,您应该没问题。

于 2013-06-26T14:48:17.270 回答