远程运行命令上的Python Fabric返回值

时间:2018-07-18 07:34:34

标签: python linux remote-access fabric

我正在使用python fabric中的run命令来远程执行脚本。

C = fabric.Connection('ip', user='user', connect_kwargs={"password": "password"})
try:
   r = C.run('python3 ~/script.py')
   if r:
        print('{} SUCCESS'.format(C.host))
        break
   else:
        print('{} ERROR'.format(C.host))
        break
except:
    print('{} ERROR'.format(C.host))

我的script.py是:

def download_file(url, filename):
    try:
        response = requests.get(url)
        # Open file and write the content
        with open(filename, 'wb') as file:
            # A chunk of 128 bytes
            for chunk in response:
                file.write(chunk)
        return 1
    except requests.exceptions.RequestException as e:
        return 0

download_file(url,filename)

当我执行运行命令时,是否有办法查看函数中返回的值是1还是0?

谢谢!

2 个答案:

答案 0 :(得分:0)

根据Fabric 2.x文档,默认情况下会捕获结果并将其提供给结果的stdoutstderr属性下:http://docs.fabfile.org/en/2.0/getting-started.html#run-commands-via-connections-and-run

r = C.run('python3 ~/script.py')
print(r.stdout)

答案 1 :(得分:0)

run命令返回一个Result对象,该对象具有以下属性(以及其他属性):

  • stdout -标准输出
  • stderr -标准错误
  • 退出-该程序的退出代码
  • 确定-退出== 0
  • return_code -退出的别名

所以您需要检查exited / return_code属性。

但是,您的脚本不会随函数的返回码一起退出。为此,您需要使用该值sys.exit,因此将download_file更改为:

sys.exit(download_file(url))

将从download_file函数获得返回代码。您需要在脚本上import sys,以确保您有sys模块可用。

当程序由于非零退出代码而失败时,将引发UnexpectedExit异常。为了在这种情况下获得退出代码,您可以(a)捕获异常,或者(b)将参数warn=True传递给run命令,因此run命令看起来像:

r = C.run('python3 ~/script.py', warn=True)