Цикл чтения, который не вылетает при воссоздании файла - PullRequest
0 голосов
/ 11 декабря 2019

У меня есть скрипт на python, который должен прочитать байты из файла и опубликовать их в комнате MQTT. Но файл может быть воссоздан во время процесса (скрипт python должен быть запущен 24/24).

Я пробовал этот код, но когда файл воссоздается, os.path.isfile всегда возвращает false.

def mqttToTtyOnMessage(client, userdata, message):
        tty = openFile(filename, os.O_WRONLY)
        print("%s @ %s : Message from %s to %s\n" %
              (threadName, time.ctime(time.time()), message.topic, filename))
        try:
            os.write(tty, message.payload)
        except:
            print("%s @ %s : Unable to write message to file %s\n%s" %
                  (threadName, time.ctime(time.time()), filename, sys.exc_info()))
            while True:
                if os.path.isfile(filename):
                    print("%s @ %s : File exist, come back to main loop." % (threadName, time.ctime(time.time())))
                    subTty = openFile(filename, os.O_WRONLY)
                    os.write(subTty, message.payload)
                    break
                else:
                    print("%s @ %s : File still not exist, wait few seconds and check again." % (threadName, time.ctime(time.time())))
                    time.sleep(1)
        os.close(tty)

Функция openFile выглядит следующим образом:

def openFile(filename, permission):
    try:
        fd = os.open(filename, permission)
    except:
        print("%s @ %s : Unable to write message to file %s\n%s" %
            (threadName, time.ctime(time.time()), filename, sys.exc_info()))
    return (fd)

Я надеюсь, у вас есть идеи об ошибке в моем коде или о другом способе достижения этой цели. Спасибо

РЕДАКТИРОВАТЬ : Решите эту проблему, изменив способ, которым я проверил, существует ли файл:

def mqttToTtyOnMessage(client, userdata, message):
        try:
            tty = openFile(filename, os.O_WRONLY)
            os.write(tty, message.payload)
            print("%s @ %s : Message from %s to %s\n" %
              (threadName, time.ctime(time.time()), message.topic, filename))
        except OSError:
            print("%s @ %s : Unable to write message to file %s\n%s\n" %
                  (threadName, time.ctime(time.time()), filename, sys.exc_info()))
            while True:
                try:
                    subTty = openFile(filename, os.O_WRONLY)
                    os.write(subTty, message.payload)
                    break
                except:
                    print("%s @ %s : Can't open file for the moment, try again in 5s.\n%s\n" % ("mqttToTty", time.ctime(time.time()), sys.exc_info()))
                time.sleep(5)
        os.close(tty)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...