Also: ich starte in meinem Skript einen Kindprozess, der eine potentiell unendliche Laufzeit hat, und möchte während dieser Laufzeit dessen stdout und stderr "belauschen", und ihm obendrein inputs geben.
Meine Ansätze bisher arbeiten mit subprocess.communicate oder indem ich auf subprocess.stdout.read() als FileObjekt zugreife. Leider friert beides mein Skript ein, da jeweils auf die Beendigung des Kindprozesses gewartet wird.
Das erste Code-Gerüst ist folgendes (ohne subprocess.communicate ect.):
Code: Alles auswählen
import os, subprocess, shlex, time, sys, logging
from subprocess import PIPE, check_call
t = 0
logging.basicConfig(
filename='/home/thomas/gphoto_test/gphoto.log',
level=logging.INFO,
filemode='w',
format='%(asctime)s:%(levelname)s:%(message)s'
)
args = shlex.split("/home/thomas/gphoto_test/test.py")
def start_process(args):
try:
p = subprocess.Popen(args,
stdin=PIPE,
stdout=PIPE,
stderr=PIPE,
cwd='/home/thomas/gphoto_test',
)
except subprocess.CalledProcessError as (bla):
logging.error('CalledProcessError: {0}'.format(bla))
except OSError as (errorno, errorstr):
logging.error("OSError({0}): {1}".format(errorno, errorstr))
except ValueError as (errorno, errorstr):
logging.error("ValueError({0}): {1}".format(errorno, errorstr))
except:
logging.error("Unexpected error:", sys.exc_info()[0])
raise
return p
while 1:
if time.time()-t >= 2:
if not t: p = start_process(args)
t = time.time()
Für Hilfe und Anregungen wäre ich sehr dankbar...
Thomas