Python fabric sudo() 输出中返回奇怪的转义字符

3 投票
1 回答
1281 浏览
提问于 2025-04-17 04:14

我正在尝试运行的代码:

from fabric.api import *
from fabric.contrib.files import *

def git():
    with cd('/home/something'):
        output = sudo('git log --pretty=oneline --no-color --abbrev-commit -n 1 HEAD')
        print repr(output)

在 fabric 0.9.某个版本下执行:

$ fab git
[localhost] Executing task 'git'
[localhost] sudo: git log --pretty=oneline --no-color --abbrev-commit -n 1 HEAD
Password for deploy@localhost: 
[localhost] out: 67bec96 Merge branch 'master' of /home/something
"67bec96 Merge branch 'master' of /home/something"

在 fabric 1.2.2 下执行:

$ fab git
[localhost] Executing task 'git'
[localhost] sudo: git log --pretty=oneline --no-color --abbrev-commit -n 1 HEAD
[localhost] Login password: 
[localhost] out: sudo password:
[localhost] out: 67bec96 Merge branch 'master' of /home/something
[localhost] out: 
"\x1b[?1h\x1b=\r67bec96 Merge branch 'master' of /home/something\x1b[m\r\n\r\x1b[K\x1b[?1l\x1b>"

你可以看到,fabric 1.2.2 的输出中有一些不必要的转义字符,影响了实际输出的显示。

我尝试使用 sudo('... ').stdout,但结果还是一样。

有什么想法吗?

1 个回答

3

根据Fabric的更新日志:

在第7项更改中,run和sudo这两个命令的默认设置发生了变化,它们的pty参数的默认值从原来的False改成了True。这意味着,如果你在远程运行程序时,这些程序的行为可能会有很大不同,因为它们在连接到一个终端(tty)时会表现得不一样。

简单来说,从0.9版本到1.x版本,默认值发生了交换,所以你看到的输出结果也不同了。

撰写回答