import logging
import sys
from azure.storage.blob import BlobServiceClient
from azure.identity import DefaultAzureCredential
from azure.servicebus import ServiceBusClient
QUEUE_NAME = "{QUEUE_NAME}"
CONNECTION_STRING = "{CONNECTION_STRING}"
credential = DefaultAzureCredential()
def receive_message(message_func: callable) -> ():
"""
:param message_func: a function that takes a dict as its argument representing the message payload and operates on it
:return:
"""
with ServiceBusClient.from_connection_string(
conn_str=CONNECTION_STRING
) as servicebus_client:
with servicebus_client.get_queue_receiver(queue_name=QUEUE_NAME) as receiver:
messages = receiver.receive_messages()
for message in messages:
try:
message_func(json.loads(str(message)))
receiver.complete_message(message)
except Exception:
logging.exception(
f"Failed to process message: {message.message_id}"
)
def process_as2_message(as2_message: dict) -> ():
'''
:param as2_message: dictionary representing the message payload
:return:
'''
message_payload_subject = as2_message["subject"]
blob_url = message_payload_subject.replace(MESSAGE_SUBJECT_PREFIX, "")
with BlobServiceClient.from_connection_string(
BLOB_SECRETS.connection_string
) as blob_service_client:
with blob_service_client.get_container_client(
BLOB_SECRETS.container_name
) as container_client:
try:
payload_downloader = container_client.download_blob(blob_url)
payload_content = payload_downloader.readall()
logging.info(
f"Successfully Downloaded message payload for message: {blob_url}"
)
logging.info(f"Message content: {payload_content}")
# TODO: process transformation on message here
except Exception:
logging.exception("Failed to download message payload")
if __name__ == "__main__":
if len(sys.argv) > 1 and sys.argv[1] == "readiness":
sys.exit(0)
while True:
logging.info("Processing messages from queue")
service_bus.receive_message(process_as2_message)
< /code>
Цель состоит в том, чтобы запустить это в K8s. У меня есть следующий Dockerfile: < /p>
FROM python:3.9-alpine3.13
RUN apk update && apk upgrade
RUN apk add --update cmake gpgme-dev libc-dev python3 py-pip python3-dev cmake gcc g++ openssl-dev build-base git curl perl-dev linux-headers bash
ENV CONTAINER_HOME=/usr/src/app
WORKDIR /usr/src/app
WORKDIR /usr/src/app/queue
WORKDIR /usr/src/app/config
COPY *.py /usr/src/app/
COPY *.txt /usr/src/app/
RUN python3 -m pip install -q --upgrade pip
RUN pip3 install -r $CONTAINER_HOME/requirements.txt
WORKDIR /usr/src/app
CMD [ "python3", "./main.py"]
< /code>
Файлы teletn.txt Содержит:
azure-common
azure-core
azure-storage-blob
azure-storge-common < /p>
Ошибка Я получаю: Importerror: не могу использовать. 'azure.core.pipeline.transport' (/usr/local/lib/python3.9/site-packages/azure/core/pipeline/transport/__init__.py) та же ошибка. В контейнере Docker в оболочке я могу поставить файл в сообщении исключения и вижу, что класс присутствует в этом каталоге, поэтому я знаю, что он там. Я взял эту конфигурацию Docker из другой службы, которая использует эти зависимости, и она работает нормально. < /P>
Что может это вызвать? Я подтвердил, что на изображении есть только одна среда Python. Я могу постоянно воспроизводить в контейнере в раковине Python и в своем собственном локальном Mac. Зависимость буквально там в каталоге, и я вижу ее, почему Python не может?Name: azure-storage-blob
Version: 12.17.0
Summary: Microsoft Azure Blob Storage Client Library for Python
Home-page: https://github.com/Azure/azure-sdk-for-python/tree/main/sdk/storage/azure-storage-blob
Author: Microsoft Corporation
Author-email: ascl@microsoft.com
License: MIT License
Location: /usr/local/lib/python3.9/site-packages
Requires: azure-core, cryptography, isodate, typing-extensions
Required-by:
/usr/local/lib/python3.9/site-packages/azure/core $
Открытие оболочки Python в контейнере Docker и печати sys.path показывает ['', '/usr/local/lib/python39.zip', '/usr/local/lib/python3.9 '/usr/local/lib/python3.9/site-packages'ty
У меня есть программа Python, которую я пытаюсь запустить в контейнере Docker, которая последовательно выбрасывает ошибку импорта.[code]import logging import sys
from azure.storage.blob import BlobServiceClient from azure.identity import DefaultAzureCredential from azure.servicebus import ServiceBusClient
def receive_message(message_func: callable) -> (): """ :param message_func: a function that takes a dict as its argument representing the message payload and operates on it :return: """ with ServiceBusClient.from_connection_string( conn_str=CONNECTION_STRING ) as servicebus_client: with servicebus_client.get_queue_receiver(queue_name=QUEUE_NAME) as receiver: messages = receiver.receive_messages() for message in messages: try: message_func(json.loads(str(message))) receiver.complete_message(message) except Exception: logging.exception( f"Failed to process message: {message.message_id}" )
def process_as2_message(as2_message: dict) -> (): ''' :param as2_message: dictionary representing the message payload :return: ''' message_payload_subject = as2_message["subject"] blob_url = message_payload_subject.replace(MESSAGE_SUBJECT_PREFIX, "") with BlobServiceClient.from_connection_string( BLOB_SECRETS.connection_string ) as blob_service_client: with blob_service_client.get_container_client( BLOB_SECRETS.container_name ) as container_client: try: payload_downloader = container_client.download_blob(blob_url) payload_content = payload_downloader.readall() logging.info( f"Successfully Downloaded message payload for message: {blob_url}" ) logging.info(f"Message content: {payload_content}") # TODO: process transformation on message here except Exception: logging.exception("Failed to download message payload")
if __name__ == "__main__": if len(sys.argv) > 1 and sys.argv[1] == "readiness": sys.exit(0)
while True: logging.info("Processing messages from queue") service_bus.receive_message(process_as2_message) < /code> Цель состоит в том, чтобы запустить это в K8s. У меня есть следующий Dockerfile: < /p> FROM python:3.9-alpine3.13
RUN python3 -m pip install -q --upgrade pip RUN pip3 install -r $CONTAINER_HOME/requirements.txt
WORKDIR /usr/src/app
CMD [ "python3", "./main.py"]
< /code> Файлы teletn.txt Содержит: azure-common azure-core azure-storage-blob azure-storge-common < /p> Ошибка Я получаю: Importerror: не могу использовать. 'azure.core.pipeline.transport' (/usr/local/lib/python3.9/site-packages/azure/core/pipeline/transport/__init__.py) та же ошибка. В контейнере Docker в оболочке я могу поставить файл в сообщении исключения и вижу, что класс присутствует в этом каталоге, поэтому я знаю, что он там. Я взял эту конфигурацию Docker из другой службы, которая использует эти зависимости, и она работает нормально. < /P> Что может это вызвать? Я подтвердил, что на изображении есть только одна среда Python. Я могу постоянно воспроизводить в контейнере в раковине Python и в своем собственном локальном Mac. Зависимость буквально там в каталоге, и я вижу ее, почему Python не может?Name: azure-storage-blob Version: 12.17.0 Summary: Microsoft Azure Blob Storage Client Library for Python Home-page: https://github.com/Azure/azure-sdk-for-python/tree/main/sdk/storage/azure-storage-blob Author: Microsoft Corporation Author-email: ascl@microsoft.com License: MIT License Location: /usr/local/lib/python3.9/site-packages Requires: azure-core, cryptography, isodate, typing-extensions Required-by: /usr/local/lib/python3.9/site-packages/azure/core $ [/code] Открытие оболочки Python в контейнере Docker и печати sys.path показывает ['', '/usr/local/lib/python39.zip', '/usr/local/lib/python3.9 '/usr/local/lib/python3.9/site-packages'ty
У меня быстрый API, развернутый для функции Azure. На местном уровне все работает, как и ожидалось. Однако при развертывании я получаю следующую ошибку. Ошибка уже происходит при импорте:
# if I remove this line it works
from azure.identity import...
У меня быстрый API, развернутый для функции Azure. На местном уровне все работает, как и ожидалось. Однако при развертывании я получаю следующую ошибку. Ошибка уже происходит при импорте:
# if I remove this line it works
from azure.identity import...