Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python @任务(hosts=[…])生成上下文,但-H生成连接?_Python_Invoke_Fabric_Python Fabric 2 - Fatal编程技术网

Python @任务(hosts=[…])生成上下文,但-H生成连接?

Python @任务(hosts=[…])生成上下文,但-H生成连接?,python,invoke,fabric,python-fabric-2,Python,Invoke,Fabric,Python Fabric 2,Python 3.8.2、Fabric 2.5.0、Paramiko 2.7.2、Invoke 1.4.1 你好, 我有一个FAB文件,需要处理在命令行中传递的主机(使用-H),如果未传递-H,则需要处理FAB文件中定义的主机。以下是我面临的问题的一个例子: target\u group=None @任务 def产品(c): _环境装卸工(c,“产品”) def_环境处理器(c,环境名称): 全球目标集团 如果不是hasattr(c,“主机”): target_group=group(“some

Python 3.8.2、Fabric 2.5.0、Paramiko 2.7.2、Invoke 1.4.1

你好,

我有一个FAB文件,需要处理在命令行中传递的主机(使用
-H
),如果未传递
-H
,则需要处理FAB文件中定义的主机。以下是我面临的问题的一个例子:

target\u group=None
@任务
def产品(c):
_环境装卸工(c,“产品”)
def_环境处理器(c,环境名称):
全球目标集团
如果不是hasattr(c,“主机”):
target_group=group(“somehost1.tld”、“somehost2.tld”)
@任务(主机=目标组)
def测试(c):
印刷品(c)
如果我运行
fab prod test

<Context: <Config: {'run': {'asynch ...
<Connection host=1>
<Connection host=2>
因此,使用
@task(hosts=[…]
decorator)传递主机会生成一个c
上下文
对象,使用
-H
会生成一个c
连接
对象

我知道使用任务(
prod(c)
)包装环境逻辑可能有问题……但是有没有办法确保任务(
test(c)
)总是接收到一个
连接
对象……或者我根本上误解了什么

谢谢

编辑:我还尝试直接传递一个主机列表
(例如@task(hosts=[“somehost1.tld”、“somehost2.tld”)
,结果相同

编辑:以下是当前的解决方法,但如果您有很多任务,则显然不太理想:

@任务
def测试(c):
如果不是hasattr(c,“主机”):
对于目标群体中的c:
测试(c)
其他:
logging.info(f“Targeting{c.host}”)

使用自定义任务装饰器的变通方法:

def\u任务处理程序(func):
@任务
@functools.wrapps(func)
def包装(c):
如果不是hasattr(c,“主机”):
对于目标群体中的c:
func(c)
其他:
func(c)
返回包装器