将bash脚本转换为Python - 如何处理heredocs?

时间:2013-07-24 20:53:23

标签: bash shell python

我正在学习Python,同时将一些bash脚本转换为Python shell脚本。我还不知道的一件事是如何处理这些脚本中使用的heredocs。以下是bash脚本如何使用heredocs的两个示例:

我需要知道如何在Python中做的最重要的事情是第一种情况,其中heredoc用于提供命令的标准响应,因此命令可以非交互式运行:

sudo command << 'EOF'
prompt_response1
    prompt_response2
EOF

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

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中做这些事情?

2 个答案:

答案 0 :(得分:3)

Python中的Heredoc

使用多行字符串(三引号字符串'''""")。请参阅Strings from tutorial

运行命令

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

答案 1 :(得分:0)

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

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

完整文档:http://amoffat.github.com/sh
关注Github:http://github.com/amoffat/sh

Example如何解决这个问题中的第一个问题:

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\n")

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

它可以像这样处理sudo

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

它有一个称为STDOUT / ERR回调的简洁功能:

  

sh可以使用回调来逐步处理输出。这与重定向非常相似:通过将参数传递给_out或_err(或两者)特殊关键字参数,除了这次,你传递一个callable。将为您的命令输出的每行(或大块)数据调用此可调用对象。

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