如何将 pyinvoke 用作库并将任务包含在单个文件中?

How to use pyinvoke as a library and include the tasks in a single file?

我想创建一个独立的 python 脚本,它使用 invoke 并且还包括要执行的任务。一个最小的工作示例如下所示:

#!/usr/bin/env python3

from invoke import task, Program

@task()
def foo(c):
    print("Task...")

program = Program()

program.run()

如果我将脚本命名为 example.py,我希望能够使用脚本执行以下操作:

(py37) bash-3.00$ ./example.py foo
Task...

如果我将任务放在一个名为 tasks.py 的单独文件中,一切正常。该文档显示了如何将任务放在一个单独的包中,而不是顶级脚本本身。我怀疑可以通过向 Program() 提供正确的 namespace 参数来实现,但我还没有找到有效的值。

您完全正确,非常接近解决方案。 Program 医生说...

namespace:

A Collection to use as this program's subcommands.

If None (the default), the program will behave like invoke, seeking a nearby task namespace with a Loader and exposing arguments such as --list and --collection for inspecting or selecting specific namespaces.

您需要初始化一个集合,添加任务并将其传递给 Program

#!/usr/bin/env python3

import sys
from invoke import task, Program, Collection


@task()
def foo(c):
    print("Task...")


namespace = Collection()
namespace.add_task(foo)

program = Program(namespace=namespace)
program.run()

如您所愿将其另存为 example.py 和 运行。

$ python3 example.py foo
Task...