关于shell:将bash脚本转换为Python – 如何处理heredocs?

converting bash scripts to Python - how to handle heredocs?

我正在学习Python,同时将一些bash脚本转换为python shell脚本。有一件事我还不明白,那就是如何处理这些脚本中使用的Heredocs。下面是bash脚本如何使用heredocs的两个示例:

在python中,我需要知道的最重要的一点是,在这里,首先使用heredoc为命令提供标准响应,以便命令可以非交互运行:

1
2
3
4
sudo command << 'EOF'
prompt_response1
    prompt_response2
EOF

其次,tee用于创建需要sudo权限的文件:

1
2
3
4
5
6
7
8
sudo tee /etc/xdg/autostart/updateNotificationChecker.desktop > /dev/null << 'EOF'
[Desktop Entry]
Name=Update Notification
Exec=bash /usr/local/bin/updateNotification.sh
Terminal=false
Type=Application
NoDisplay=true
EOF

我如何在Python中执行这些操作?


Python中的Heredoc

使用多行字符串(三引号字符串'''""")。请参见教程中的字符串。

运行命令

1
2
3
4
5
import subprocess
subprocess.Popen(['cat'], stdin=subprocess.PIPE).communicate('''
    Hello multiline-string
    simliar to heredoc.
'
'')


sh(以前是pbs)是一个完整的python子进程接口,允许您像调用函数一样调用任何程序:

1
2
from sh import ifconfig
print(ifconfig("wlan0"))

完整文档:http://amoffat.github.com/sh后续Github:http://github.com/amoffat/sh

它如何解决这个问题的第一个问题的示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
from sh import ssh
import os, sys

# open stdout in unbuffered mode
sys.stdout = os.fdopen(sys.stdout.fileno(),"wb", 0)

aggregated =""
def ssh_interact(char, stdin):
    global aggregated
    sys.stdout.write(char.encode())
    aggregated += char
    if aggregated.endswith("password:"):
        stdin.put("correcthorsebatterystaple
"
)

p = ssh("10.10.10.100", _out=ssh_interact, _out_bufsize=0, _tty_in=True)
p.wait()

它可以这样处理sudo

1
2
with sudo:
    print(ls("/root"))

它有一个称为stdout/err回调的简洁特性:

sh can use callbacks to process output incrementally. This is done much like redirection: by passing an argument to either the _out or _err (or both) special keyword arguments, except this time, you pass a callable. This callable will be called for each line (or chunk) of data that your command outputs.

最后,作为标准python工具的一部分,有raw_input,它写入标准输出并从标准输入中读取。这也将解决这个问题中的第二个问题。