Прерывание ввода чтения в Python - PullRequest
0 голосов
/ 02 марта 2019

Я очень плохо знаком с Python.Я работаю над проектом, который считывает данные с акселерометра и записывает эти данные в файл.Я сделал это с большим успехом.Сейчас я пытаюсь сделать это там, где команда input (), которая читает данные, прерывается каждые две минуты, после чего записывается новый файл, и процесс повторяется.Это должно использоваться в исследовательском устройстве в автомобиле, поэтому сценарий запускается при запуске автомобиля.Ниже выложен пример скрипта, прямо сейчас он никогда не входит в основной цикл (после ввода).Мне нужно прервать этот ввод через временное окно, и я хотел бы узнать, как.Мой код ниже.Спасибо!

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()

Ответы [ 2 ]

0 голосов
/ 02 марта 2019

Обязательное «это не проверено», поскольку, конечно, у меня нет фактического устройства.

Если я правильно понял, устройство инициирует вызов 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 относительно статических переменных в функциях.Обычным способом является создание класса и сохранение статических данных в качестве атрибутов экземпляра, но поскольку этот метод несколько связан с экземпляром объекта библиотеки, я не совсем уверен, что это можно сделать.

0 голосов
/ 02 марта 2019

Я не совсем уверен, потому что я не совсем понимаю ваш сценарий, но, возможно, так оно и есть, потому что вы вызываете filenamer() до main() и у вас есть цикл?

...