在python中嵌入bash

2024-04-19 11:56:25 发布

您现在位置:Python中文网/ 问答频道 /正文


Tags: python
3条回答

import os
os.system ("bash -c 'echo $0'")

会为你做吗?

编辑:关于可读性

是的,当然,你可以让它更可读

import os
script = """
echo $0
ls -l
echo done
"""
os.system("bash -c '%s'" % script)

EDIT2:关于宏,据我所知,没有哪一个python不走得更远,而是介于

import os
def sh(script):
    os.system("bash -c '%s'" % script)

sh("echo $0")
sh("ls -l")
sh("echo done")

上一个例子,你基本上得到了你想要的(但是你必须考虑到一些辩证的限制)

理想的方法是:

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')

你也可以在ScriptException中添加一个很好的__str__方法(你肯定需要它来调试你的脚本),但是我把这个留给读者。

如果不使用stdout=subprocess.PIPE等,则脚本将直接附加到控制台。例如,如果您有ssh的密码提示,那么这非常方便。因此,您可能需要添加标志来控制是否要捕获stdout、stderr和stdin。

如果要调用系统命令,请使用subprocess模块。

相关问题 更多 >