Source code for lib.source.plainTextStream

# -*- coding: utf-8 *-*
#from copy import deepcopy
#import select
import time
import sys#, os
#import fcntl
import subprocess
import linecache


from . import _dimension
from _source import _source

[docs]class plainTextStream(_source): def __init__(self, command, start_via, stop_via, dim_seperator, output_file, data_type = "unknown", key_to_end_process = "", readoutEverNLine = 1, infoEveryNLines = 1000): super(plainTextStream,self).__init__(data_type) self.dimension = _dimension.dimension self.file_name = output_file self._command = command #self.file_name = command self.key_to_end_process = key_to_end_process self.dim_seperator = dim_seperator self.start_via = start_via self.stop_via = stop_via self._readoutEverNLine = readoutEverNLine self._infoEveryNLines = infoEveryNLines
[docs] def setInfoEveryNLines(self,nLines): self._infoEveryNLines = int(nLines)
[docs] def getInfoEveryNLines(self): return self._infoEveryNLines
[docs] def setReadoutEverNLine(self,nLine): self._readoutEverNLine = int(nLine)
[docs] def getReadoutEverNLine(self): return self._readoutEverNLine
def _getMinMax(self,dims): sys.exit("ERROR: source.stream need a given dimension.includeFromTo()-range") #def _non_block_read(self, output): #''' even in a thread, a normal read with block until the buffer is full ''' #fd = output.fileno() #fl = fcntl.fcntl(fd, fcntl.F_GETFL) #fcntl.fcntl(fd, fcntl.F_SETFL, fl | os.O_NONBLOCK) #try: #return output.read().strip().split("\n") #except: #return [] def _prepareReadOut(self, matrixClass): self._prepareStandard(matrixClass) #start stream #sys.stdin.write(b"%s\n" %self.key_to_end_process) #from tempfile import SpooledTemporaryFile as tempfile #self.tempfile = tempfile() self.engine = subprocess.Popen( self._command, bufsize=1, #shell=True, #close_fds=True, stdin =sys.stdin,#self.tempfile,# stdout=sys.stdout,#subprocess.PIPE, #stderr=subprocess.PIPE) ) if self.start_via != "": #print self.start_via,44 self.engine.stdin.write(b"%s" %self.start_via) self.engine.stdin.flush() #self.engine.stdin.close()#preventing senseless waiting #self.engine.terminate() #self.done_reading_old_output = True #self.done_readout = False #self.output = [] self.pos_output = 0 self.read_n_lines = 0 self.step_n_lines = 0 step = 0 max_try = 5 while True:#step < max_steps: try: self.len_output = len(file(self.file_name, "r").readlines()) break except IOError:#found no readable file called self.file_name if step == 0: print "found no file called %s" %self.file_name step+=1 print "try again %s times" %(max_try-step) time.sleep(1) if step == max_try: print "ERROR: doest your output_file exist?" done_readout = self._endReadOut() # end subprocess time.sleep(1) sys.exit() def _endReadOut(self): try: if self.key_to_end_process != "": print "finish process via key ' %s '" %self.key_to_end_process for h in range(10): # to ensure ending #sys.stdin.write(b"%s\n" %self.key_to_end_process) ###dont work at the moment self.engine.stdin.write(b"%s" %self.key_to_end_process) #self.engine.stdin.flush() #self.engine.stdin.close() except (IOError, AttributeError): pass try: print "closing process" time.sleep(1) #for h in range(10): #self.engine.close() self.engine.kill() #self.engine.wait() except (IOError, AttributeError): pass finally: return True def _readOut(self, readout_interrupt, end_readOut): # ensure, that the process will terminate if end_readOut: done_readout = self._endReadOut() else: done_readout = False #def _readOut(self, readout_one_line, end_readOut): while True:#self.pos_output < self.len_output: #i = self.readOut_range[self.step_in_readOut_range] try: #for i in readOut_range: line = linecache.getline(self.file_name, self.pos_output+1) #linecache.clearcache() file_dim = line[:-2].split(self.dim_seperator) self._assignValues(file_dim) self.pos_output += self._readoutEverNLine self.read_n_lines += 1 self.step_n_lines += 1 if self.step_n_lines >= self._infoEveryNLines or \ self.pos_output >=self.len_output: self.len_output = len(file(self.file_name, "r").readlines()) perc_done = (self.read_n_lines+1)/float(self.len_output) print "readout %s from approx. %s lines (%s Percent)" %(self.read_n_lines, self.len_output,perc_done) self.step_n_lines = 0 if perc_done >=1.0: print 333, perc_done done_readout = self._endReadOut() break if readout_interrupt: done_readout=False break except KeyboardInterrupt: done_readout = self._endReadOut() return done_readout