簡體   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