Рекурсивное ожидание нажатия клавиши Python - PullRequest
0 голосов
/ 19 марта 2020

У меня есть файл журнала данных CAN, который я разделяю на две равные части на основе номеров строк. Я играю этот файл, используя canplayer, наблюдаю за поведением на симуляторе и затем нажимаю y/n, где y - наблюдаемое поведение или n - не наблюдаемое поведение.

code logic:
 1. split file into two parts based on line numbers or entries.
 2. play file1, observe behavior
 3. if behavior observed, take file1, split into two parts again and follow same procedure

(если в файле1 не наблюдается поведение, выполните следующие действия или проигнорируйте)

 2*. play file2, observe behavior 
 3*. if behavior observed, take file2, split into two parts again and follow same procedure

У меня есть следующий код:

def runParser(self):
    #get the number of lines in file
    num_lines = sum(1 for line in open(self.fileName))
    print(num_lines)
    if(num_lines % 2 == 0):
        splitLen = num_lines/2
    else:
        splitLen = num_lines/2 + 1

    self.splitFile(splitLen) # successfully splits the file and outputs two new files.
    command = "canplayer -I {}".format(self.out1.name)
    #print(command)
    os.system(command)
    print('Do you see the behaviour? press y/n')
    keyboard.on_press(self.accessBehavior)

def accessBehavior(self,event):
    if event.name == 'y':
        self.fileName = self.out1.name
        self.runParser()

    if event.name == 'n':
        command = "canplayer -I {}".format(self.out2.name)
        print(command)
        os.system(command)
        self.fileName= self.out2.name
        self.runParser()

def splitFile(self, len):
    self.fin = open(self.fileName,'rb')
    self.out1 = open('out{}.log'.format(self.fileCount),'wb')
    self.fileCount+=1 # initialized to zero
    self.out2 = open('out{}.log'.format(self.fileCount),'wb')
    self.fileCount+=1

    count=0
    for line in self.fin:
        count +=1
        if count >= len:
            #write to new file
            self.out2.write(line)
        else:
            self.out1.write(line)

    self.fin.close()
    self.out1.close()
    self.out2.close()
  1. Проблема, с которой я сталкиваюсь, заключается в том, что keyboard.on_press(self.accessBehavior) ждет только первого нажатия. Я хочу, чтобы программа принимала несколько нажатий y/n в зависимости от поведения, которое я вижу после выполнения команды canplayer ..

  2. Итак, если поведение не наблюдается, я нажимаю n и шаги повторяются до тех пор, пока все данные в файле не будут исчерпаны, и в файле присутствует только одна строка данных, которая вызывает поведение.

Вот пример того, как данные CAN выглядит файл:

(1584526791.145716) vcan0 13F#000000050000001F
(1584526791.145719) vcan0 164#0000C01AA8000031
(1584526791.145721) vcan0 17C#0000000010000012
(1584526791.145723) vcan0 18E#00005C
(1584526791.147489) vcan0 183#0000000D0000101D
(1584526791.147526) vcan0 143#6B6B00D1
(1584526791.149458) vcan0 095#800007F400000008
(1584526791.153293) vcan0 166#D0320018
(1584526791.153332) vcan0 158#0000000000000019
(1584526791.153335) vcan0 161#000005500108001C
(1584526791.153337) vcan0 191#010090A1410003
(1584526791.153360) vcan0 244#0000000142
(1584526791.154416) vcan0 133#00000000A7
(1584526791.154447) vcan0 136#000200000000002A
(1584526791.154450) vcan0 13A#0000000000000028
(1584526791.154452) vcan0 13F#000000050000002E
(1584526791.154454) vcan0 164#0000C01AA8000004
(1584526791.156373) vcan0 17C#0000000010000021
 .....
 .....
 .....
...