Python-子过程-记录和转储测量

时间:2018-06-26 03:31:34

标签: python subprocess ubuntu-16.04 python-3.5

在具有Ubuntu 16.04LTS的python3中,我有一个从主脚本创建的子进程,用于记录连接到本地计算机的设备的测量结果。我想知道如何在要完成数据记录时将消息发送到此子过程,并切换到将测量结果转储到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 :(得分:0)

通过将Control + C事件发送到子进程来解决。一个try-except-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")