Невозможно запустить другой скрипт Python в функции Azure, используя Python - PullRequest
0 голосов
/ 07 октября 2019

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

import os, json, subprocess
import logging   
import azure.functions as func

def main(event: func.EventGridEvent):
    try:
        correctionsMessages = event.get_json()
        for correctionMessage in correctionsMessages:
            strMessage = json.dumps(correctionMessage)
            full_path_to_script = os.path.join(os.path.dirname(os.path.realpath(__file__)) + '/' + correctionMessage['ScriptName'] + '.py')
            logging.info('Script Path: %s', full_path_to_script)
            logging.info('Parameter: %s', json.dumps(detectionMessage))
            subprocess.check_call('python '+ full_path_to_script + ' ' +  json.dumps(strMessage))

        result = json.dumps({
            'id': event.id,
            'data': event.get_json(),
            'topic': event.topic,
            'subject': event.subject,
            'event_type': event.event_type,
        })
        logging.info('Python EventGrid trigger processed an event: %s', result)

    except Exception as e:
        logging.info('Error: %s', e)

Приведенный выше код выдает ошибку для subprocess.check_call . Ошибка: «Ошибка: [Errno 2] Нет такого файла или каталога:« python /home/site/wwwroot/Detections/Script1.py ». Script1.py находится в той же папке с init .py. Когда я запускаю эту функцию локально, она работает абсолютно нормально.

1 Ответ

1 голос
/ 07 октября 2019

По моему опыту, ошибка была вызвана тем, что функция subprocess.check_call не знает путь вызова python, а не из-за пути Script1.py.

В вашей локальной среде разработки функций Azureпуть python настроен в локальной переменной среды, поэтому функция subprocess.check_call может вызывать python через поиск в исполняемом файле python по путям переменной среды. Но в облаке нет значения пути python, предварительно настроенного в той же переменной среды, только узел функций Azure знает реальный абсолютный путь для Python.

Таким образом, решение состоит в том, чтобы найти реальный абсолютный путьPython и использовать его вместо python в вашем коде.

Однако в Azure Function для среды выполнения стека Python я думаю, что не стоит использовать subprocess.check_call для порождения дочернего процесса для выполнения некоторогообработка для данного сообщения. Безопасный и правильный способ - определить функцию в Script1.py или непосредственно в __init__.py для передачи данного сообщения в качестве параметров для реализации той же функции.

...