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() |
它可以这样处理
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工具的一部分,有