def run_script(script, stdin=None):
"""Returns (stdout, stderr), raises error on non-zero return code"""
import subprocess
# Note: by using a list here (['bash', ...]) you avoid quoting issues, as the
# arguments are passed in exactly this order (spaces, quotes, and newlines won't
# cause problems):
proc = subprocess.Popen(['bash', '-c', script],
stdout=subprocess.PIPE, stderr=subprocess.PIPE,
stdin=subprocess.PIPE)
stdout, stderr = proc.communicate()
if proc.returncode:
raise ScriptException(proc.returncode, stdout, stderr, script)
return stdout, stderr
class ScriptException(Exception):
def __init__(self, returncode, stdout, stderr, script):
self.returncode = returncode
self.stdout = stdout
self.stderr = stderr
Exception.__init__('Error in script')
是
会为你做吗?
编辑:关于可读性
是的,当然,你可以让它更可读
EDIT2:关于宏,据我所知,没有哪一个python不走得更远,而是介于
上一个例子,你基本上得到了你想要的(但是你必须考虑到一些辩证的限制)
理想的方法是:
你也可以在
ScriptException
中添加一个很好的__str__
方法(你肯定需要它来调试你的脚本),但是我把这个留给读者。如果不使用
stdout=subprocess.PIPE
等,则脚本将直接附加到控制台。例如,如果您有ssh的密码提示,那么这非常方便。因此,您可能需要添加标志来控制是否要捕获stdout、stderr和stdin。如果要调用系统命令,请使用subprocess模块。
相关问题 更多 >
编程相关推荐