【问题标题】:Flask-Script command that passes all remaining args to nose?将所有剩余参数传递给鼻子的烧瓶脚本命令?
【发布时间】:2016-02-10 13:58:56
【问题描述】:

我使用一个简单的命令来运行我的测试:

@manager.command
def test():
    """Run unit tests."""
    import nose
    nose.main(argv=[''])

但是,nose 支持许多现在我无法通过的有用参数。

有没有办法用 manager 命令运行鼻子(类似于上面的调用)并且仍然能够将参数传递给鼻子?例如:

python manage.py test --nose-arg1 --nose-arg2

现在我会收到来自Manager 的错误,即--nose-arg1 --nose-arg2 未被识别为有效参数。我想将这些参数传递为nose.main(argv= <<< args comming after python manage.py test ... >>>)

【问题讨论】:

  • 如果python 本身的参数数量保持不变,您可以从sys 传递argv[3:]
  • 那是我的第一次尝试,但是如果 Flask-Script Manager 看到“无法识别”的参数,而不是忽略它们,它就会退出并出错。我的问题的一个解决方案是让它忽略其余的论点,并能够像你建议的那样接受它们。
  • 好吧,我应该更仔细地阅读这个问题。我找到了一种 hacky 方式来做你想做的事。我会为此写一个答案。

标签: python flask nose flask-script


【解决方案1】:

Flask-Script 有一个未记录的capture_all_flags flag,它将把剩余的参数传递给Command.run 方法。这在tests 中得到了演示。

@manager.add_command
class NoseCommand(Command):
    name = 'test'
    capture_all_args = True

    def run(self, remaining):
        nose.main(argv=remaining)
python manage.py test --nose-arg1 --nose-arg2
# will call nose.main(argv=['--nose-arg1', '--nose-arg2'])

【讨论】:

    【解决方案2】:

    flask_script 的源代码中,您可以看到当执行的Command 将属性capture_all_args 设置为True 时防止了"too many arguments" 错误,而该属性在任何地方都没有记录。

    您可以在运行管理器之前在类上设置该属性

    if __name__ == "__main__":
        from flask.ext.script import Command
        Command.capture_all_args = True
        manager.run()
    

    像这样向经理提供的附加参数总是被接受的。

    此快速修复的缺点是您无法再以正常方式向命令注册选项或参数。

    如果您仍然需要该功能,您可以继承 Manager 并像这样覆盖 command 装饰器

    class MyManager(Manager):
        def command(self, capture_all=False):
            def decorator(func):
                command = Command(func)
                command.capture_all_args = capture_all
                self.add_command(func.__name__, command)
    
                return func
            return decorator
    

    然后你可以像这样使用command装饰器

    @manager.command(True)  # capture all arguments
    def use_all(*args):
        print("args:", args[0])
    
    @manager.command()  # normal way of registering arguments
    def normal(name):
        print("name", name)
    

    请注意,由于某种原因,flask_script 需要 use_all 接受可变参数,但会将参数列表存储在 args[0] 中,这有点奇怪。 def use_all(args): 不起作用,并以 TypeError "got multiple values for argument 'args'" 失败

    【讨论】:

      【解决方案3】:

      在 davidism 的解决方案中遇到了一个问题,只收到了一些 args

      再看一下文档,据记载,nose.main 会自动获取标准输入

      http://nose.readthedocs.io/en/latest/api/core.html

      所以我们现在只使用:

      @manager.add_command
      class NoseCommand(Command):
          name = 'nose'
          capture_all_args = True
      
          def run(self, remaining):
              nose.main()
      

      【讨论】:

        猜你喜欢
        • 2017-02-21
        • 2018-11-22
        • 1970-01-01
        • 2010-12-12
        • 2014-03-08
        • 2013-10-22
        • 2016-12-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多