将所有剩余参数传递给鼻子的烧瓶脚本命令?

Flask-Script command that passes all remaining args to nose?

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

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

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

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

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

现在我从 Manager 得到一个错误,即 --nose-arg1 --nose-arg2 不被识别为有效参数。我想将这些参数作为 nose.main(argv= <<< args comming after python manage.py test ... >>>)

传递

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

您可以在 class 上设置该属性,就在 运行 经理

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

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

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

如果您仍然需要该功能,您可以子class 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'"

Flask-Script 有一个未记录的 capture_all_flags flag, which will pass remaining args to the Command.run method. This is demonstrated in the 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'])

运行 遇到 davidism 的 soln 问题,其中只收到了一些参数

仔细查看文档,记录了 nose.main 自动获取 stdin

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()