这是我的面料代码:
from fabric import Connection, task
server = Connection(host="usrename@server.com:22", connect_kwargs={"password": "mypassword"})
@task
def dostuff(somethingmustbehere):
server.run("uname -a")
此代码可以正常工作。当我执行fab dostuff
时,它会执行我想要的操作。
当我删除somethingmustbehere
时,出现以下错误消息:
raise TypeError("Tasks must have an initial Context argument!")
TypeError: Tasks must have an initial Context argument!
我从未在代码中的任何地方定义somethingmustbehere
。我放了进去,错误消失了,一切正常。但为什么?这是什么变量?我为什么需要它?为什么这么重要?如果它是如此重要,为什么它只能是空的?我真的在这里迷路了。是的,它可以工作,但是我无法运行我不理解的代码。它使我发疯。 :-)
请注意,我在说的是Fabric的Python 3(!)版本! Fabric版本是2.4.0
答案 0 :(得分:3)
要能够运行@task
,您需要一个上下文参数。 Fabric使用期望看到上下文对象的调用task()
。通常,我们将变量命名为c
或ctx
(我经常使用它来使其更清晰)。我不喜欢使用c
,因为我通常将其用于连接
从invoke软件包仓库中在github上检查此line,您会发现当context参数不存在时,它会引发异常,但并不能解释原因!
要了解有关Context对象,它是什么以及为什么需要它的更多信息,可以在pyinvoke网站上阅读以下内容:
此外:这个“上下文”参数到底是什么?常见问题 任务运行者面临的是“全局”数据的传输-加载的值 从配置文件或其他配置矢量(通过CLI给出) 标志,这些标志是在“设置”任务等中生成的。
某些库(例如Fabric 1.x)通过模块级实现此功能 属性,使测试变得困难且容易出错,限制了 并发,并增加了实现的复杂性。
调用将状态封装在传递给任务的显式Context对象中 当他们执行时。上下文是主要的API端点,提供 遵守当前状态的方法(例如Context.run)以及 访问该状态本身。
检查这两个链接:
说实话,我浪费了很多时间弄清楚什么是上下文以及为什么没有它我的代码将无法运行。但是到了某个时候,我只是放弃并开始使用它来使我的代码运行没有错误。