Python-Subprozess-Wrapper-Klasse

In Version 2.6 veraltet: Das Befehlsmodul wurde in Python 3.0 entfernt. Verwenden Sie stattdessen das Unterprozessmodul.

Versuchen Sie, sich mit Subprocess von Befehlen zu verabschieden.

shell.py


#!/usr/bin/python

import sys
import shlex
from   subprocess import Popen, PIPE, STDOUT

__version__ = '0.0.1'

#----------------------------------------------------------
# SHELL CLASS
#----------------------------------------------------------
class Shell(object):

    def __init__(self):

        self.p  = None

    def cmd(self, cmd):

        p_args = {'stdin'     : None,
                  'stdout'    : PIPE,
                  'stderr'    : STDOUT,
                  'shell'     : False,}

        return self._execute(cmd, p_args)

    def pipe(self, cmd):

        p_args = {'stdin'     : self.p.stdout,
                  'stdout'    : PIPE,
                  'stderr'    : STDOUT,
                  'shell'     : False,}

        return self._execute(cmd, p_args)

    def _execute(self, cmd, p_args):

        try :
            self.p = Popen(shlex.split(cmd), **p_args)
            return self

        except :
            print 'Command Not Found: %s' % (cmd)
            sys.exit()

    def commit(self):

        result = self.p.communicate()[0]
        status = self.p.returncode

        return (status, result)

#----------------------------------------------------------
# TEST
#----------------------------------------------------------
def test():
    '''
    tac ./test.txt | sort | uniq -c

    '''
    shell= Shell()

    #--- CASE 1
    (return_code, stdout) = shell.cmd('tac ./test.txt').pipe('sort').pipe('uniq').commit()
    print 'RETURN_CODE: %s  \nSTDOUT: \n%s' % (return_code, stdout)

    #--- CASE 2
    s = shell.cmd('tac ./test.txt')
    s.pipe('sort')
    s.pipe('uniq')
    (return_code, stdout) = s.commit()
    print 'RETURN_CODE: %s, \nSTDOUT: \n%s' % (return_code, stdout)

if __name__ == '__main__':test()

test.txt


1
2
3
4
5
6
7
8
9
0

Ergebnis

RETURN_CODE: 0
STDOUT:
0
1
2
3
4
5
6
7
8
9

RETURN_CODE: 0,
STDOUT:
0
1
2
3
4
5
6
7
8
9

Fazit

Ich glaube nicht, dass ich in die falsche Richtung gehe, aber die Fehlerbehandlung ist seltsam. Lassen Sie es uns bald überprüfen.

Recommended Posts

Python-Subprozess-Wrapper-Klasse
Python-Syslog-Wrapper-Klasse
YOLO Python-Wrapper-Klasse
[Python] -Klasse, Instanz
"Kanrika" die Python-Klasse
Über Python, Klasse
Python-Klasse, Instanz
# Python-Grundlagen (Klasse)
Python-Klasse (Python-Lernnotiz ⑦)
Fallklasse in Python
[Python] Klassenvererbung (super)
Python selbst erstellte Klassensortierung
Grundmethode der [Python] -Klasse
Method_missing-ähnlicher Wrapper in Python
[Python] Klassenvererbung, überschreiben
Klassennotation in Python
Liste der Python-Ausnahmeklassen
Python: Klassen- und Instanzvariablen
Zusammenfassung des Bereichs der Python-Klassenmitglieder
Python-Klassen- und Instanzvariablen
Wrapper mit Hadoop in Python
Perl-Objekt und Python-Klasse Teil 2.
Python
[Hikari-Python] Kapitel 09-03 Klasse (Vererbung)
In Python-Klassenvariablen versteckte Landminen
Python-Klassendefinitionen und Instanzbehandlung
"Die einfachste Python-Einführungsklasse" geändert
Klasse
[Python] Weg zur Serpent (3) Python-Klasse
Untersuchen Sie die Klasse eines Objekts mit Python
Perl-Objekt und Python-Klasse Teil 1.
Einfache parallele Ausführung mit Python-Unterprozess
Klasse
[Python] Erbt eine Klasse mit Klassenvariablen
Generieren Sie eine erstklassige Sammlung in Python
Erstellen Sie mit Class einen Python-Funktionsdekorator
[Einführung in Python] Wie verwende ich eine Klasse in Python?
Implementieren Sie __eq__ usw. generisch in der Python-Klasse
[Lernnotiz] Grundlagen des Unterrichts mit Python
[Python] Wie man eine Klasse iterierbar macht
[Python] Unterschied zwischen Klassenmethode und statischer Methode
Verwendung von __slots__ in der Python-Klasse
Generieren Sie eine Klasse aus einer Zeichenfolge in Python
[Python2.7] Zusammenfassung der Verwendung des Unterprozesses
Implementierter Python-Wrapper für Qiita API v2
Apropos Python-Klassenattribute und Metaklassen