在python函数中运行shell脚本并从脚本中获取数据

时间:2014-04-07 08:00:07

标签: python bash

我即将编写一个调用一个或多个shell脚本的python脚本。我不能使用python执行某些命令,所以我被迫在python函数中运行shell脚本。

现在,我想知道是否有可能从shell脚本中获取任何数据:我假设我可以使用subprocess.Popen从脚本中获取退出代码,但这是我可以从中获取的所有内容shell脚本?

理想情况下,我不需要大量的东西,但我想将shell脚本设置为在进程通过或失败时返回X或Y,如果出现问题则将Z设置为Z但是它取决于具体原因,并将其传递给python函数,该函数将相应地执行。

这是可能的,还是我在浪费时间尝试整合两者?

2 个答案:

答案 0 :(得分:0)

import sys
from subprocess import Popen, PIPE; STDOUT

pyversion = sys.version_info.major

class interact():
    def __init__(self, c):
        self.handle = Popen(c, stdin=PIPE, stdout=PIPE, stderr=STDOUT, shell=True)
        sleep(1)
    def send(self, what):
        for c in what:
            sys.stdout.write(c)
            if pyversion == 3:
                self.handle.stdin.write(bytes(c, 'UTF-8'))
            else:
                self.handle.stdin.write(c)
            sys.stdout.flush()
            sys.handle.stdin.flush()
            sleep(0.05)
    def getrow(self):
        return self.handle.stdout.readline()
    def poll(self):
        return self.handle.poll()
    def done(self):
        if self.poll() == 1:
            return 'Return Y'
        return 'Return X'
    def close(self):
        self.handle.stdout.close()
        self.handle.stdin.close()

你可以做这样的事情,你有自己的结构,并根据退出代码或当前的运行代码返回你想要的任何东西,如果这个过程已经完成,那么None

只需将其用作:

handle = interact('ls -lah')
while handle.poll() is None:
    pass
result = handle.done()

或者调整它,我在执行SSH调用时使用此代码作为基本结构,并且用于生成OpenSSL键,就像魅力一样,但我认为我必须调整它才能使它与SSH一起工作(无法找到代码atm)

您可以添加的内容是:

try:
    self.handle.stdin.write(...)
except:
    self.error = True

并且done()如果发生错误,您只需返回Z(如您所述)。

注意:如果你没有在一个繁重的输出脚本/命令上调用getrow(),缓冲区将会溢出并挂起整个内容,所以一定要点击一下一段时间或删除stdout=PIPE, stderr=STDOUT

答案 1 :(得分:0)

使用子流程:

import subprocess

p = subprocess.Popen(['ls', '-ltr'], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
ret = p.wait()
out, err = p.communicate()
print out

我不会使用shell论证,因为它会让你的生活变得复杂。如果您想以异步方式执行操作,可以使用poll()代替wait()

有关更多信息,请阅读子流程文档: https://docs.python.org/2/library/subprocess.html