我正在学习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中做这些事情?
答案 0 :(得分:3)
使用多行字符串(三引号字符串'''
或"""
)。请参阅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
写入标准输出并从标准输入读取。这也将解决这个问题的第二个问题。