4

我编写了一个小程序,每个小步舞曲从两件设备中读取值,然后将其保存到 .csv 文件中。我希望在每次收集每个点后更新和保存文件,这样如果电脑崩溃或发生其他问题,就不会发生数据丢失。为此,我打开文件(ab 模式),使用写入行并循环关闭文件。集合之间的时间约为 1 分钟。这工作得很好,但问题是在数据收集 5-6 小时后,它停止保存到 .csv 文件,并且没有出现任何错误,代码继续运行,图形正在更新,就像什么都没发生一样,但打开.csv 文件显示数据丢失。我想知道我使用的代码是否有问题。我也不应该从中运行一个进行实时绘图的子进程,

##Initial file declaration and header
with open(filename,'wb') as wdata:
     savefile=csv.writer(wdata,dialect='excel')
     savefile.writerow(['System time','Time from Start(s)','Weight(g)','uS/cm','uS','Measured degC','%/C','Ideal degC','/cm'])

##Open Plotting Subprocess
 draw=subprocess.Popen('TriPlot.py',shell=True,stdin=subprocess.PIPE,stdout=subprocess.PIPE)
##data collection loop
while True:
   Collect Data x and y
   Waits for data about 60 seconds, no sleep or pause commoand used, pyserial inteface is used.
   ## Send Data to subprocess 
   draw.stdin.write('%d\n' % tnow)
   draw.stdin.write('%d\n' % s_w)
   draw.stdin.write('%d\n' % tnow)
   draw.stdin.write('%d\n' % float(s_c[5]))

   ##Saving data Section 
   wdata=open(filename,'ab')
   savefile=csv.writer(wdata,dialect='excel')
   savefile.writerow([tcurrent,tnow,s_w,s_c[5],s_c[7],s_c[9],s_c[11],s_c[13],s_c[15]])
   wdata.close()

PS 此代码使用以下包用于未显示的代码。pyserial、csv、os、subprocess、Tkinter、string、numpy、time 和 wx。

4

1 回答 1

1

如果draw.stdin.write()阻塞,则可能意味着您没有draw.stdout及时消费。由于完整的操作系统管道缓冲区,文档警告死锁。

如果您不需要输出,您可以设置stdout=devnull在哪里,devnull = open(os.devnull, 'wb')否则有几种方法可以在不阻塞代码的情况下读取输出:线程、选择、tempfile.TemoraryFile.

于 2013-01-16T23:01:11.547 回答