首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python -子处理-记录和倾倒测量

Python -子处理-记录和倾倒测量
EN

Stack Overflow用户
提问于 2018-06-26 03:31:33
回答 1查看 33关注 0票数 0

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

Main.py

代码语言:javascript
复制
# 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

代码语言:javascript
复制
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)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-27 03:49:43

通过向子进程发送一个控件+C事件来解决这个问题。一个尝试-除了-其他块捕捉到了键盘中断,处理了它,然后我优雅地退出了这个块。退出后,我将记录的数据写入csv文件。

main.py

代码语言:javascript
复制
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

代码语言:javascript
复制
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")
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51034489

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档