Вызов скриптов и библиотек на других языках
Обладая базовым уровнем знаний Python, можно выдать продукт, сопоставимый с готовыми решениями лидеров рынка. Количество готового кода постоянно растет, поэтому основное, что должен понять начинающий кодер, прежде чем накинуться на решения задачи и ее реализацию в коде - нужно потратить немного времени на поиск готовых решений. Другой вопрос, каково качество этого кода?
Вряд ли начинающий кодер будет допущен до какой-то уникальной задачи, следовательно, вероятность найти готовое или похожее решение совсем ненулевая. Но здесь тебя могут подстерегать «грабли» — решение может быть на другом языке.
Получается, готовое решение любой задачи можно загуглить?
И что тогда? Учить 100500 языков?
Python позволяет осуществлять вызовы скриптов и библиотек на других языках. И для этого не обязательно их учить, главное – понимать, что подавать на вход и что ты получишь на выходе. Как раз похожий кейс возник и у нас.
И в чем заключался кейс?
При решении задачи по анализу диалогов клиентов и брокеров, для получения информации по полу и возрасту клиента, нужно было получить спектральные и частотные результаты обработки аудио файлов в конкретном виде. Усиленное гугление выдало, что результаты в данном виде могут быть получены после обработки аудио с помощью функции specan языка R. Прямого аналога данной функции в Python опознано не было, возможные варианты получения аналогичных данных с помощью Фурье навевали тоску. Дальнейший поиск выдал решение — запускаем функции R напрямую из Python. Способов такого запуска существует несколько: можно использовать специализированные библиотеки или осуществить исполнение скриптов с помощью командной строки (command line tools) + промежуточное хранение файлов на диске (filling air gap).
И как конкретно был решен вопрос?
Мы выбрали command line tools, так как для этого не требовалась установка дополнительных модулей и их настройка:
1) Заюзаем builtin модуль Python subprocess, с его помощью запускаем процесс, через который вызываем запуск скрипта на R.
2) Запущенный скрипт на R осуществляет обработку аудио в части снятия аудиохарактеристик файла и их записи в файл «data.csv» с использованием библиотек warbleR и tuneR. Передача параметров в скрипт R осуществляется через аргументы как при вызове файла из командной строки.
На выходе в папке «./data/tmpcsv/» получаем файл csv, в котором записаны аудиохарактеристики файлов, доступный для обработки в Python.
В итоге, мы выяснили, что из Python можно легко запустить скрипт на R и организовать обмен данными с помощью инструментов командной строки. Конечно, есть более продвинутые способы, в частности, взаимодействие с языком R можно производить с помощью библиотек rpy2 и reticulate. Но это уже совсем другая история…
Аналогично с помощью похожих инструментов можно организовать взаимодействие Python с любым другим языком программирования.
1. У вас объявление функции некорректное, код не запустится: keyword arguments всегда идут после positional arguments:
def r_spec(duration, path, temp, path2script, command='Rscript'):
2. Для чего склеивать два листа, если вы их тут же создаёте? Сделайте сразу один: cmd = [command, path2script, name, duration, path, temp]
3. subprocess.Popen() — довольно низкоуровневая функция, вам отлично подойдёт subprocess.run()
Комментарий удален модератором
1. Да, спасибо, действительно опечатка. В рабочем варианте передача данных в функцию выглядит как у Вас.
2. Два листа были реализованы только для простоты восприятия исходных данных, которые передавались скрипту на R.
3. Такой вариант опробовался. subprocess.run() хоть и запускался без ошибок, но скрипт на R не отрабатывал, то есть csv не создавался. При этом subprocess.Popen() отработал, поэтому остановились на таком варианте.