Python Fabric 将输出保存到变量

3 投票
1 回答
6804 浏览
提问于 2025-04-18 16:29

我正在尝试把一个sudo命令的输出结果保存在一个变量里,这样我就可以查看一个文件的内容。我的代码是这样的:

def tail_pg():
    log = StringIO();
    sudo('ls -t /var/lib/pgsql/9.3/data/pg_log/| head -n 1', stdout=log)

    print type(log), log
    sudo('tail -n 25 -f %s' % log, pty=True)

我加了一个打印语句来帮助排查问题。结果返回的是这些值,而不是日志文件的名字:

<type 'instance'> <StringIO.StringIO instance at 0x10345f638>

我好像是按照Fabric的文档在使用run这个功能(链接),但我可能忽略了什么。运行这个任务时,我收到了这个错误:

[centos] Executing task 'tail_pg'
[centos] sudo: ls -t /var/lib/pgsql/9.3/data/pg_log/| head -n 1

<type 'instance'> <StringIO.StringIO instance at 0x10345f638>
[centos] sudo: tail -n 25 -f <StringIO.StringIO instance at 0x10345f638>
[centos] out: /bin/bash: -c: line 0: syntax error near unexpected token `newline'
[centos] out: /bin/bash: -c: line 0: `tail -n 25 -f <StringIO.StringIO instance at 0x109c313f8>'
[centos] out:


Fatal error: sudo() received nonzero return code 1 while executing!

Requested: tail -n 25 -f <StringIO.StringIO instance at 0x109c313f8>
Executed: sudo -S -p 'sudo password:'  /bin/bash -l -c "tail -n 25 -f <StringIO.StringIO instance at 0x109c313f8>"

Aborting.
Disconnecting from centos... done.

1 个回答

5

你把事情弄得有点复杂了,其实没必要。stdout和stderr这两个参数的作用是,如果你想把错误信息(stderr)也一起捕捉到标准输出(stdout)里,就可以用它。你可以简单地这样做:

def tail_pg():
    log = sudo('ls -t /var/lib/pgsql/9.3/data/pg_log/| head -n 1')

    print type(log), log
    sudo('tail -n 25 -f %s' % log, pty=True)

fabric会从run()和sudo()这两个函数返回标准输出,你可以把它保存到一个变量里。

撰写回答