Python-子流程-记录和转储度量

Python-子流程-记录和转储度量,python,subprocess,ubuntu-16.04,python-3.5,Python,Subprocess,Ubuntu 16.04,Python 3.5,在使用Ubuntu 16.04LTS的python3中,我从主脚本创建了一个子进程,用于记录连接到本地机器的设备的测量值。我想知道当我想要完成数据记录时,如何向这个子流程发送消息,并切换到将测量值转储到csv文件。下面显示的是我到目前为止尝试的精简版本,但代码挂起,我无法转储我记录的测量结果。事实上,我只记录了1次测量。我不知道如何在记录数据时异步检查stdin输入。我能得到一些帮助吗 Main.py ekg.py 通过向子流程发送control+C事件解决了此问题。try-except-els

在使用Ubuntu 16.04LTS的python3中,我从主脚本创建了一个子进程,用于记录连接到本地机器的设备的测量值。我想知道当我想要完成数据记录时,如何向这个子流程发送消息,并切换到将测量值转储到csv文件。下面显示的是我到目前为止尝试的精简版本,但代码挂起,我无法转储我记录的测量结果。事实上,我只记录了1次测量。我不知道如何在记录数据时异步检查stdin输入。我能得到一些帮助吗

Main.py

ekg.py


通过向子流程发送control+C事件解决了此问题。try-except-else块捕捉到键盘中断并对其进行处理,然后我优雅地退出该块。退出后,我将记录的数据写入csv文件

main.py

ekg.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()
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)
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()
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")