Как добавить и выполнить двоичный файл в функциях Azure? - PullRequest
0 голосов
/ 13 марта 2019

Мне нужно запустить бинарный файл linux (ffmpeg для примера) из функции Azure, которая запускает python / linux.

Я не нашел ни того, как его упаковать, ни каквыполните его.

В некоторых документах Python по Azure показано, что в составе пакета функции может быть корневая папка bin/.Поместить файл туда, а затем вызвать subprocess.run(), не удается.Очевидно, он не может найти исполняемый файл.

Я попытался переместить файл в корневой каталог или попытаться найти его по полному пути (я пробовал /home/site/www и его варианты).Все еще не повезло.

Чего мне не хватает?

Ответы [ 2 ]

3 голосов
/ 13 марта 2019

Я следовал официальному руководству Create your first Python function in Azure (preview), чтобы создать HttpTrigger функцию для Python, и попробовал различные способы заставить ffmpeg работать в функциях Azure, затем он работает для меня.

Вот мои шаги, чтобы сделать это выше, как показано ниже, надеюсь, это поможет.

  1. Следуйте официальному руководству по функциям Azure для Python, чтобы установить Azure Functions Core Tools на мою локальную машину Windows, чтобы создать проект с именем MyFunctionProj и функцию с именем HttpTrigger.

  2. Перед загрузкой ffmpeg с развертыванием я проверяю архитектуру платформы ОС моего экземпляра функций Azure в Azure, изменяя официальный пример кода с помощью приведенного ниже кода.

    # add these codes
    import platform, os
    .....
    
    def main(req: func.HttpRequest) -> func.HttpResponse:
        if name:
            return func.HttpResponse(f"Hello {name}! {platform.architecture()}")
    

    Его результат - Hello peter-pan! ('64bit', '') в браузере.

  3. Затем я помещаю статический двоичный файл ffmpeg AMD64, загруженный из https://johnvansickle.com/ffmpeg/, в свой MyFunctionProj и изменяю мой код ниже, чтобы проверить путь к файлу, и команду func azure functionapp publish <my app name> для публикации в Azure.

    def main(req: func.HttpRequest) -> func.HttpResponse:
        if name:
            return func.HttpResponse(f"Hello {name}! {platform.architecture()} {os.listdir()} {os.listdir('HttpTrigger')}")
    

    Его результат равен Hello peter-pan! ('64bit', '') ['in.mp4', 'ffmpeg', 'host.json', 'requirements.txt', 'ffmpeg.exe', '.python_packages', 'HttpTrigger'] ['in.mp4', '__pycache__', 'sample.dat', 'host.json', 'function.json', '__init__.py'] в броузере, как и в моем MyFunctionProj

  4. Я обнаружил, что все в папке MyFunctionProj будет загружено в Azure и вызовет os.listdir(), чтобы показать список файлов MyFunctionProj, поэтому текущий путь в Python такой же, как и MyFunctionProje локально. Затем я попытался вызвать ffmpeg в моей локальной среде Windows с помощью кода ниже.

    def main(req: func.HttpRequest) -> func.HttpResponse:
        if name:
            return func.HttpResponse(f"Hello {name}! {platform.architecture()} {os.listdir()} {os.listdir('HttpTrigger')} {os.path.exists('in.mp4')} {os.popen('ffmpeg.exe -i in.mp4 out.mp4').read()} {os.path.exists('out.mp4')} {os.popen('del out.mp4').read()}")
    

    Он работает для вывода файла out.mp4 с помощью команды ffmpeg.exe -i in.mp4 out.mp4, а затем для воспроизведения его в команду del out.mp4.

  5. Попробуйте сделать так, чтобы это работало для среды Linux в Azure Function. Я изменяю команды с помощью ./ffmpeg -i in.mp4 out.mp4 и rm out.mp4. Но это не сработало в функции Azure. Это может быть вызвано отсутствием разрешения на выполнение двоичного файла ffmpeg linux при загрузке из Windows. Поэтому я проверил свое предположение с помощью команд ls -l ffmpeg и chmod u+x ffmpeg, прежде чем вызывать его.

    def main(req: func.HttpRequest) -> func.HttpResponse:
        if name:
            return func.HttpResponse(f"Hello {name}! {platform.architecture()} {os.listdir()}  {os.listdir('HttpTrigger')} {os.popen('ls -l ffmpeg').read()} {os.popen('chmod u+x ffmpeg').read()} {os.popen('ls -l ffmpeg').read()} {os.path.exists('in.mp4')} {os.popen('./ffmpeg -i in.mp4 out.mp4').read()} {os.path.exists('out.mp4')} {os.popen('rm out.mp4').read()}")
    

    Теперь работает, результат примерно такой, как показано ниже. Я довольно красиво отформатировал.

    Hello peter-pan! // Offical sample output
    ('64bit', '') // the Linux platform architecture of Azure Functions for Python 
    ['in.mp4', 'ffmpeg', 'host.json', 'requirements.txt', 'ffmpeg.exe', '.python_packages', 'HttpTrigger']  // file list of MyFunctionProj
    ['in.mp4', '__pycache__', 'sample.dat', 'host.json', 'function.json', '__init__.py'] // file list of HttpTrigger
    -r--r--r-- 1 root root 69563752 Mar 13  2019 ffmpeg // before chmod u+x
    -rwxr--r-- 1 root root 69563752 Mar 13  2019 ffmpeg // after chmod u+x
    True  // in.mp4 exists
    True // out.mp4 exists before delete it using `rm`
    

Примечание: я думаю, что проблема разрешения на выполнение ffmpeg возникнет, когда вы разрабатываете в Linux. И файл in.mp4 взят из https://github.com/kkroening/ffmpeg-python/blob/master/examples/in.mp4. Я пытался использовать пакет ffmpeg-python для реализации ваших потребностей, но, похоже, он не работает на локальном и Azure.

0 голосов
/ 15 июля 2019

Вы можете запускать такие команды, как apt-get install ffmpeg с консоли Kudu на https://<YOUR-APP>.scm.azurewebsites.net.

Но среда будет сброшена при развертывании или масштабировании приложения.Другим решением будет использование развертывания докера, чтобы вы могли указать, какие двоичные файлы вы хотите добавить на сервер.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...