Python - Подпроцесс - Запись и сброс измерений - PullRequest
0 голосов
/ 26 июня 2018

В python3 с Ubuntu 16.04LTS у меня есть подпроцесс, который я создал из своего основного скрипта для записи измерений с устройства, подключенного к моей локальной машине.Я хотел бы знать, как отправить сообщение этому подпроцессу, когда я хочу завершить запись данных, и переключиться на сброс измерений в файл CSV.Ниже показана урезанная версия того, что я пробовал до сих пор, но код зависает, и я не могу записать результаты измерений, которые я записал.На самом деле, я записываю только 1 измерение.Я не уверен в том, как асинхронно проверять входы stdin при записи данных.Могу ли я получить помощь?

Main.py

# start subprocess
p_1 = subprocess.Popen(["./ekg.py", saveFilename_ekg], stdout=subprocess.PIPE, stderr=subprocess.PIPE)

# do other stuff
...

# send message to quit
message = str("1")
encMsg = message.encode()
print("Message:", encMsg.decode())

p_stdout = p_1.communicate(input=encMsg)[0]

# print "Done" from subprocess 
print(p_stdout.decode('utf-8').strip())

# kill subprocess
p_1.kill()

ekg.py

def dumpLiveData(outputFile):

    ekg = ekgClass()
    dataMeasurements = []

    for liveData in ekg.getLiveData():

        # monitor stdin for message
        if int(sys.stdin.read()) == 1:
            break
        else:
            meas = [liveData.time, liveData.pulseWaveform]
            dataMeasurements.append(meas)

    #print ("Dumping data")

    with open(outputFile, 'wb') as csvfile:
        writer = csv.writer(csvfile, quoting=csv.QUOTE_NONNUMERIC)
        #print ("Created text file")

        header = ["Time", "Waveform value"]
        writer.writerow(header)

        for idx, val in enumerate(dataMeasurements):
            writer.writerow(dataMeasurements[idx])    

    print("Done")


if __name__== "__main__":  

    # get parameters
    parser = argparse.ArgumentParser(description="ekg.py")
    parser.add_argument("outputFile", help="Output CSV file.")

    # parse
    args = parser.parse_args()

    # record and dump measurements
    dumpLiveData(args.outputFile)

1 Ответ

0 голосов
/ 27 июня 2018

Решил, отправив событие control + C в подпроцесс.Блок try-then-else поймал прерывание клавиатуры, обработал его, и затем я грациозно вышел из блока.После выхода я записываю записанные данные в CSV-файл.

main.py

import subprocess, signal 

# start subprocess
p_1 = subprocess.Popen(["./ekg.py", saveFilename_ekg], stdout=subprocess.PIPE, stderr=subprocess.PIPE)

# do other stuff
...

# send control + C event
p_1.send_signal(signal.SIGINT)

stdout, stderr = p_1.communicate(input=encMsg)[0]

# print output from subprocess 
print(stdout.decode('utf-8').strip())

# wait for subprocess to write file
p_1.wait()

# kill subprocess
p_1.kill()

ekg.py

def dumpLiveData(outputFile):

    ekg = ekgClass()
    dataMeasurements = []
    exception_found = None

    try:

        for liveData in ekg.getLiveData():
            if exception_found == True:
                break

            meas = [liveData.time, liveData.pulseWaveform]
            dataMeasurements.append(meas)

    except KeyboardInterrupt:

        exception_found = True

    else:
        pass

    print ("Dumping data")

    with open(outputFile, 'wb') as csvfile:
        writer = csv.writer(csvfile, quoting=csv.QUOTE_NONNUMERIC)
        print ("Created text file")

        header = ["Time", "Waveform value"]
        writer.writerow(header)

        for idx, val in enumerate(dataMeasurements):
            writer.writerow(dataMeasurements[idx])    

    print("Done")
...