繁体   English   中英

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

[英]run a shell script in a python function and get data from the script

我将要编写一个Python脚本,该脚本将调用一个或多个Shell脚本。 我无法仅使用python执行某些命令,因此我被迫在python函数中运行shell脚本。

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

理想情况下,我不需要很多东西,但是我想将shell脚本设置为:如果进程通过或失败,则返回X或Y;如果情况变坏,则返回Z;但是这取决于特定的原因,并通过到python函数,它将相应地起作用。

这是可能的还是我在浪费时间尝试将两者融合在一起?

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

还是tweek,我在进行SSH调用和生成OpenSSL密钥时就使用了此代码作为基本结构,其工作原理很吸引人,但是我认为我必须对其进行tweek才能使其与SSH一起使用(找不到代码atm)

您可以添加的内容是:

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

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

注意:如果未在输出繁重的脚本/命令上调用getrow() ,缓冲区将溢出并挂起整个对象,因此请确保getrow()点击一下或删除stdout=PIPE, stderr=STDOUT

使用子过程:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM