Результат: Исключение сбоя: Ошибка операционной системы: [Errno 30] Файловая система, доступная только для чтения, в функциях Python и Azure

#python #postgresql #azure-functions #azureservicebus

Вопрос:

У меня есть функция Python, и я развернул ее в Azure Funtion. Я использовал TXT-файл для хранения времени, и я буду его использовать. На локальном компьютере эта функция выполняется без проблем. Но я получил приведенную ниже ошибку при запуске в Azure:

 Result: Failure Exception: OSError: [Errno 30] Read-only file system: 'date_time.txt' Stack: 
 

В своем поиске я нахожу некоторые решения, такие как TempFile, но мне нужно значение date_time.txt на следующий раз.

Мой код:

 import os
import psycopg2
import datetime
import logging
import tempfile
import pandas as pd
import json
import sqlalchemy
from azure.servicebus import ServiceBusClient, ServiceBusMessage
import azure.functions as func


connstr = "****"
topic_name = "***"
subscription_name = "***"


def get_engine(database='portal_rms', username='***', password='**', host='***', port=5432):
    engine_string = f"postgresql psycopg2://{username}:{password}@{host}:{port}/{database}"
    engine = sqlalchemy.create_engine(engine_string)
    return engine


def read_from_db(table_name, date_time):
    acceleration_array = []
    engine = get_engine()
    connection = engine.connect()
    metadata = sqlalchemy.MetaData()
    pinconnector_attacheddevicelogdata = sqlalchemy.Table(
        table_name, metadata, autoload=True, autoload_with=engine)
    query = sqlalchemy.select([pinconnector_attacheddevicelogdata]).where(pinconnector_attacheddevicelogdata.columns.capture_time > date_time)
        .order_by(pinconnector_attacheddevicelogdata.columns.capture_time).limit(100)
    ResultProxy = connection.execute(query)
    ResultSet = ResultProxy.fetchall()
    engine.dispose()
    return ResultSet


def get_date_time(date_time_string):
    [date, time] = date_time_string.split(" ")
    [year, month, day] = date.split("-")
    [hour, minute, second] = time.split(":")
    [second, microsecond] = second.split(".")
    [year, month, day, hour, minute, second, microsecond] = list(
        map(lambda x: int(x), [year, month, day, hour, minute, second, microsecond]))
    return datetime.datetime(year, month, day, hour, minute, second, microsecond, tzinfo=psycopg2.tz.FixedOffsetTimezone(offset=0, name=None))


def write_date_time(date_time, address="date_time.txt"):
    file1 = open(address, "w ")
    file1.write((str(date_time)).split(" ")[0])
    file1.close()


def read_date_time(address="date_time.txt"):
    file1 = open(address, "r")
    date_time = file1.readline()
    date_time = get_date_time(date_time)
    file1.close()
    return date_time


def get_query_latest_date_time(db_query, date_time):
    for item in db_query:
        if item["capture_time"] > date_time:
            date_time = item["capture_time"]
    return date_time


def transform(query_row):
    query_row = dict(query_row)
    for item in ['capture_time', 'received_time', 'read_time']:
        query_row[item] = str(query_row[item]).split(" ")[0]
    return query_row


date_time = read_date_time()
db_query = read_from_db("pinconnector_attacheddevicelogdata", date_time)
write_date_time(db_query[-1]["capture_time"])
# print(db_query)
#data_send = json.dumps(db_query)
data_send = json.dumps(list(map(lambda x: transform(x), db_query)))


with ServiceBusClient.from_connection_string(connstr) as client:
    with client.get_topic_sender(topic_name) as sender:
        sender.send_messages(ServiceBusMessage(data_send))
 

Комментарии:

1. Не пытайтесь использовать файловую систему в функции Azure. Нет никакой гарантии, что один и тот же сервер будет использоваться для выполнения вашей функции при двух последовательных запусках, поэтому, даже если вы сможете выполнить запись в файловую систему, вы можете обнаружить, что при последующих запусках файла там не будет. Если вам нужно сохранить состояние между запусками функции, сохраните его в другом месте, например, в хранилище Azure.

Ответ №1:

Причиной может быть несовместимая версия операционной системы. Пожалуйста, рассмотрите в этом случае пользовательский контейнер.

Вы также можете обратиться к этой аналогичной проблеме : https://docs.microsoft.com/en-us/answers/questions/67126/failure-exception-oserror-errno-30-read-only-file.html