中断 python 中的输入读取
Interrupting an input read in python
我对 python 很陌生。我正在从事一个从加速度计读取数据并将该数据写入文件的项目。我这样做很成功。我现在正在尝试使读取数据的 input() 命令每两分钟中断一次,然后写入一个新文件,然后重复该过程。这将用于车辆中的研究设备,因此脚本会在汽车启动时启动。我在下面发布了一个示例脚本,现在它永远不会进入主循环(在输入之后)。我需要在一段时间 window 后中断此输入,并且很想了解如何操作。我的代码如下。谢谢!
import sys
import time
import traceback
import serial
import datetime
import os
import datetime
import os.path
from Phidget22.Devices.Accelerometer import *
from Phidget22.PhidgetException import *
from Phidget22.Phidget import *
from Phidget22.Net import *
from pathlib import Path
from PhidgetHelperFunctions import *
os.chdir("C:/Users/Mohsine/OneDrive - UAB - The University of Alabama at
Birmingham/Car project/accelometer/")
now = datetime.datetime.now()
print(now)
m = int(now.strftime("%M"))
print(m)
def fileNamer():
looper = 1
counter = 1
while looper > 0:
fname = 'P1' + "S" + str(counter) + now.strftime("Acc Y%Y-M%m-D%d H%H-
M%M") + '.txt'
my_file = Path("C:/Users/Mohsine/OneDrive - UAB - The University of
Alabama at Birmingham/Car project/accelometer/" + fname)
if my_file.is_file():
counter = counter + 1
else:
looper = 0
return fname
def onAccelerationChangeHandler(self, acceleration, timestamp):
D=acceleration[0], acceleration[1], acceleration[2]
#print(acceleration[0])
#print(" -> Timestamp : %f\n" % timestamp)
x = str(datetime.datetime.now())
#fname = now.strftime("ACCELOMETER test ")
f = open(fname,"a")
f.write(x + " ")
f.write("%s " % str(acceleration[0]))
f.write("%s " % str(acceleration[1]))
f.write("%s\n" % str(acceleration[2]))
print(D)
f.close()
fname = fileNamer()
ch = Accelerometer()
print(fname)
ch.setDeviceSerialNumber(415163)
ch.setOnAccelerationChangeHandler(onAccelerationChangeHandler)
ch.openWaitForAttachment(5000)
accelerometer = input('accelerometer : \n ')
def main():
now = datetime.datetime.now()
k = m
print(k)
if(int(now.strftime("%M")) == k+2 or int(now.strftime("%M")) == k-58):
fname = fileNamer()
ch = Accelerometer()
print(fname)
ch.setDeviceSerialNumber(415163)
ch.setOnAccelerationChangeHandler(onAccelerationChangeHandler)
ch.openWaitForAttachment(5000)
accelerometer = input('accelerometer : \n ')
k = k+2
main()
我不太确定,因为我不完全理解你的脚本,但也许是这样,因为你在 main()
之前调用 filenamer()
并且你有一个循环?
必须"this is not tested",因为我当然没有实际设备。
如果我理解正确,只要读取一个新值,设备就会触发一个 onAccelerationChangeHandler()
调用,如果自第一次调用处理程序。
你可以试试这个:
def onAccelerationChangeHandler(self, acceleration, timestamp):
if 'file_creation_time' not in onAccelerationChangeHandler.__dict__:
# save the time in seconds since epoch for first file creation
onAccelerationChangeHandler.file_creation_time = time.time()
if 'file_name' not in onAccelerationChangeHandler.__dict__:
# get the first file name
onAccelerationChangeHandler.file_name = fileNamer()
now = time.time()
if (now - onAccelerationChangeHandler.file_creation_time) > 120:
# The file was created more than two minutes ago!
onAccelerationChangeHandler.file_creation_time = now # new creation time!
onAccelerationChangeHandler.file_name = fileNamer() # new file name!
save_stuff_into_this_file(onAccelerationChangeHandler.file_name)
现在,我不完全确定 Python 社区对函数中静态变量的立场。通常的方法是创建一个 class 并将静态数据保留为实例的属性,但由于此方法在某种程度上与库对象实例挂钩,我不完全确定它可以完成。
我对 python 很陌生。我正在从事一个从加速度计读取数据并将该数据写入文件的项目。我这样做很成功。我现在正在尝试使读取数据的 input() 命令每两分钟中断一次,然后写入一个新文件,然后重复该过程。这将用于车辆中的研究设备,因此脚本会在汽车启动时启动。我在下面发布了一个示例脚本,现在它永远不会进入主循环(在输入之后)。我需要在一段时间 window 后中断此输入,并且很想了解如何操作。我的代码如下。谢谢!
import sys
import time
import traceback
import serial
import datetime
import os
import datetime
import os.path
from Phidget22.Devices.Accelerometer import *
from Phidget22.PhidgetException import *
from Phidget22.Phidget import *
from Phidget22.Net import *
from pathlib import Path
from PhidgetHelperFunctions import *
os.chdir("C:/Users/Mohsine/OneDrive - UAB - The University of Alabama at
Birmingham/Car project/accelometer/")
now = datetime.datetime.now()
print(now)
m = int(now.strftime("%M"))
print(m)
def fileNamer():
looper = 1
counter = 1
while looper > 0:
fname = 'P1' + "S" + str(counter) + now.strftime("Acc Y%Y-M%m-D%d H%H-
M%M") + '.txt'
my_file = Path("C:/Users/Mohsine/OneDrive - UAB - The University of
Alabama at Birmingham/Car project/accelometer/" + fname)
if my_file.is_file():
counter = counter + 1
else:
looper = 0
return fname
def onAccelerationChangeHandler(self, acceleration, timestamp):
D=acceleration[0], acceleration[1], acceleration[2]
#print(acceleration[0])
#print(" -> Timestamp : %f\n" % timestamp)
x = str(datetime.datetime.now())
#fname = now.strftime("ACCELOMETER test ")
f = open(fname,"a")
f.write(x + " ")
f.write("%s " % str(acceleration[0]))
f.write("%s " % str(acceleration[1]))
f.write("%s\n" % str(acceleration[2]))
print(D)
f.close()
fname = fileNamer()
ch = Accelerometer()
print(fname)
ch.setDeviceSerialNumber(415163)
ch.setOnAccelerationChangeHandler(onAccelerationChangeHandler)
ch.openWaitForAttachment(5000)
accelerometer = input('accelerometer : \n ')
def main():
now = datetime.datetime.now()
k = m
print(k)
if(int(now.strftime("%M")) == k+2 or int(now.strftime("%M")) == k-58):
fname = fileNamer()
ch = Accelerometer()
print(fname)
ch.setDeviceSerialNumber(415163)
ch.setOnAccelerationChangeHandler(onAccelerationChangeHandler)
ch.openWaitForAttachment(5000)
accelerometer = input('accelerometer : \n ')
k = k+2
main()
我不太确定,因为我不完全理解你的脚本,但也许是这样,因为你在 main()
之前调用 filenamer()
并且你有一个循环?
必须"this is not tested",因为我当然没有实际设备。
如果我理解正确,只要读取一个新值,设备就会触发一个 onAccelerationChangeHandler()
调用,如果自第一次调用处理程序。
你可以试试这个:
def onAccelerationChangeHandler(self, acceleration, timestamp):
if 'file_creation_time' not in onAccelerationChangeHandler.__dict__:
# save the time in seconds since epoch for first file creation
onAccelerationChangeHandler.file_creation_time = time.time()
if 'file_name' not in onAccelerationChangeHandler.__dict__:
# get the first file name
onAccelerationChangeHandler.file_name = fileNamer()
now = time.time()
if (now - onAccelerationChangeHandler.file_creation_time) > 120:
# The file was created more than two minutes ago!
onAccelerationChangeHandler.file_creation_time = now # new creation time!
onAccelerationChangeHandler.file_name = fileNamer() # new file name!
save_stuff_into_this_file(onAccelerationChangeHandler.file_name)
现在,我不完全确定 Python 社区对函数中静态变量的立场。通常的方法是创建一个 class 并将静态数据保留为实例的属性,但由于此方法在某种程度上与库对象实例挂钩,我不完全确定它可以完成。