从同一脚本中调用python结构函数

从同一脚本中调用python结构函数,python,fabric,Python,Fabric,我有一个用于操作自动化的单文件脚本(日志文件下载,停止/启动多个容器。用户通过命令参数选择要执行的操作),并且希望在同一脚本中有结构函数,以及参数解析类和其他可能的类。如何从同一个python脚本中调用结构函数?我不想用“fab”这个词 作为补充,我希望这些电话也能同时进行 这是一个模型类,理想情况下包含所有必需的结构函数: class fabricFuncs: def appstate(self): env.hosts = hosts run('sudo /home/use

我有一个用于操作自动化的单文件脚本(日志文件下载,停止/启动多个容器。用户通过命令参数选择要执行的操作),并且希望在同一脚本中有结构函数,以及参数解析类和其他可能的类。如何从同一个python脚本中调用结构函数?我不想用“fab”这个词

作为补充,我希望这些电话也能同时进行

这是一个模型类,理想情况下包含所有必需的结构函数:

class fabricFuncs:
  def appstate(self):
    env.hosts = hosts
    run('sudo /home/user/XXX.sh state')
这是启动器部分:

if __name__ == "__main__":
  argParser().argParse()
  fabricFuncs().ihsstate()
argParser使用指定的命令行参数全局设置变量(只是为了阐明该部分的作用)。 不幸的是,这导致了一个没有定义主机的失败(env.hosts应该在函数中包含这些主机……或者在函数中声明它们太晚了吗?)

编辑1: 我已尝试使用以下方法启动fabric功能:

for h in env.hosts:
  with settings(hosts_string=user + "@" + h):
    fabricFuncs().ihsstate()
这有点管用。不过我有点希望,我将能够使用fabric模块(通过decorators)并行化整个过程,而无需将整个过程包装在线程代码中

编辑2: 我也尝试过这一点:

  execute(fabricFuncs().ihsstate())
它失败于:

Fatal error: Needed to prompt for the target host connection string (host: None)
Fatal error: Needed to prompt for the target host connection string (host: None)
我是否可以将整个env.hosts变量放入上面的“设置”中,而不使用“for”语句迭代该列表

编辑3: 我尝试过这样编辑fab函数,以查看env.hosts是否设置正确:

class fabricFuncs:
  def appstate(self):
    env.hosts = hosts
    print env.hosts
    run('sudo /home/user/XXX.sh state')
并且打印正确,但“run”命令仍然失败:

Fatal error: Needed to prompt for the target host connection string (host: None)
Fatal error: Needed to prompt for the target host connection string (host: None)
使用以下命令:


如果在没有fab命令的情况下运行脚本,则env.host将设置为None。
因此,如果要使用“execute”,还必须传递“hosts”参数

试试这个:

from fabric.api import execute, run
if __name__ == "__main__":
   hosts = ["host1", "host2"]
   execute(run('sudo /home/user/XXX.sh state'), hosts=hosts)

谢谢您的回答,但它仍然以以下内容结束:致命错误:需要提示输入目标主机连接字符串(主机:无)。arParser().argParse()是一个非构造函数,因此我保留了它的原样,并将execute添加到ihsstate()函数中。我想它需要使用一些“设置”参数“执行”fabric函数。@panta:是的,您需要定义env.hosts。您可以先执行定义此功能的结构函数,然后调用您的脚本。再次感谢您的回复,非常感谢。我也尝试过,但没有成功。正确设置了env.hosts(如果我在fabric函数的“run”部分之前添加print env.hosts,它将正确打印),但是整个操作仍然失败,出现“需要提示输入目标主机连接字符串(host:None)”。我将编辑这个问题,以进一步描述fab函数内部的情况。我还尝试使用roledefs。像这样设置变量:env.roledefs={'current':hosts},并在函数前面添加decorator@roles('current')。但同样的行为也发生了。