Fabric - Python 3 - 什么是上下文,它必须包含什么以及为什么我需要传递它?

cas*_*der 5 python fabric python-3.x

这是我的面料代码:

from fabric import Connection, task

server = Connection(host="usrename@server.com:22", connect_kwargs={"password": "mypassword"})

@task
def dostuff(somethingmustbehere):
    server.run("uname -a")
Run Code Online (Sandbox Code Playgroud)

这段代码工作得很好。当我执行fab dostuff它时,它会做我想做的事情。

但是,当我删除时,somethingmustbehere我收到此错误消息:

    raise TypeError("Tasks must have an initial Context argument!")
TypeError: Tasks must have an initial Context argument!
Run Code Online (Sandbox Code Playgroud)

我从未somethingmustbehere在代码中定义过任何地方。我只是把它放进去,错误就消失了,一切正常。但为什么?这个变量是什么?为什么我需要它?为什么它如此重要?如果它如此重要,为什么它可以是空的?我真的迷失在这里了。是的,它有效,但我无法运行我不理解的代码。这让我发疯。:-)

请注意,我正在谈论 Fabric 的 Python 3(!) 版本!Fabric版本是2.4.0

Pes*_*rge 6

为了能够运行,@task您需要一个上下文参数。Fabric 使用task()期望看到上下文对象的调用。通常我们将变量命名为cor ctx(我总是使用它来使其更清晰)。我不喜欢使用它,c因为我通常使用它进行连接

\n\n

从调用包存储库中检查 github 上的这一,您会发现当上下文参数不存在时它会引发异常,但它没有解释原因!

\n\n

要了解有关 Context 对象的更多信息、它是什么以及我们为什么需要它,您可以在 pyinvoke 网站上阅读以下内容:

\n\n
\n

旁白:这个 \xe2\x80\x98context\xe2\x80\x99 arg 到底是什么?任务运行者面临的一个常见问题是传输 \xe2\x80\x9cglobal\xe2\x80\x9d 数据 - 从配置文件或其他配置向量加载的值,通过 CLI 标志给出,在 \xe2\x80 中生成\x98setup\xe2\x80\x99 任务等

\n\n

一些库(例如 Fabric 1.x)通过模块级属性实现这一点,这使得测试变得困难且容易出错,限制并发性并增加实现复杂性。

\n\n

Invoke 将状态封装在显式 Context 对象中,并在任务执行时传递给任务。上下文是主要的 API 端点,提供遵循当前状态(例如 Context.run)的方法以及对该状态本身的访问。

\n
\n\n

检查这两个链接:

\n\n\n\n

老实说,我浪费了很多时间来弄清楚上下文是什么以及为什么我的代码没有它就无法运行。但在某些时候我放弃了并开始使用它来使我的代码运行没有错误。

\n

  • “说实话,我浪费了很多时间来弄清楚上下文是什么以及为什么我的代码没有它就无法运行。但在某些时候我只是放弃并开始使用它来使我的代码运行没有错误。” 哈哈,跟我的经历一模一样。感谢您的回答!! (2认同)