subprocess

Einen neuen Prozess in einem Python-Script zu starten und dessen Standardein- und -ausgabe als Datei-ähnliche Objekte zu bekommen, um ihn mit Eingaben zu füttern oder seine Ausgaben mit der Zeit weiterzuverarbeiten, ging in Python zum Beispiel so:

import os
stdin, stdout = os.popen2('ls -lA')

Wer das macht, bekommt nun eine Warnung vorgesetzt:

__main__:1: DeprecationWarning: os.popen2 is deprecated.  Use the subprocess module.

Es wird empfohlen, anstelle der bisherigen Vorgehensweise fortan das Modul "subprocess" und die darin definierte Klasse "Popen" zu verwenden. Hierbei erzeugt man zuerst eine Instanz dieser Klasse indem man dem Konstruktor alle notwendigen Informationen mitgibt, zum Beispiel den Namen des aufzurufenden Programms, wie er mit den Pipes zu verfahren hat und wie groß die zu verwendenden Puffer gewählt werden sollen. Ein Äquivalent zum oben aufgeführten Beispiel könnte so aussehen:

import subprocess
process = subprocess.Popen('ls -lA', shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, close_fds=True)
stdin, stdout = process.stdin, process.stdout

Auf den ersten Blick fällt auf, dass der Code ein gutes Stück länger als der vorherige Code ist. Da "subprocess" aber als Ersatz zu einer Reihe von Funktionen gedacht ist, ist davon auszugehen, dass an dieser Stelle Generalisierungen und Vereinfachungen geplant sind, die das unnötige Durcheinander an verschiedenen aber ähnlichen Funktionen zugunten einer einzigen, flexiblen Implementation beseitigen sollen.

Tags: Python