#python #php
#php #python #интерфейс командной строки #splunk #passthru
Вопрос:
Мы используем Splunk (инструмент для анализа машинных данных, таких как файлы журналов) и имеем приложение на PHP. Для получения некоторых данных нам нужно выполнить вызов нашего приложения на php (на основе CLI). К сожалению, Splunk поддерживает только вызовы Python.
Есть ли простой способ 1: 1 «переслать / вызвать» php с теми же аргументами и вернуть результат, например, «passthru». Я нашел только части решения с так называемым модулем подпроцесса, но мой опыт работы с python равен нулю, поэтому не могу заставить его работать.
Например, splunk вызывает:
python external_lookup.py argument1 argument2 argument3
— Затем скрипт python должен вызвать (с аргументами CLI, заданными python):
php external_lookup.php argument1 argument2 argument3
— Затем php записывает свой вывод
— Python фиксирует этот вывод и выводит его сам
Любая помощь очень ценится, или рабочий пример скрипта еще лучше.
Заранее спасибо,
Винс
Комментарии:
1. Похоже, у Splunk есть хороший RESTful API, который вы можете использовать с любого языка. docs.splunk.com/Documentation/Splunk/latest/RESTAPI /…
2.
os.system('php external.php %s'%' '.join(sys.argv[1:]))
… может быть…3. Спасибо, это связано с поиском и т.д. (Другая функциональность) Наша проблема связана с индексацией и поиском полей. Это описано здесь для python (который является единственным языком, поддерживаемым для этой функциональности): docs.splunk.com/Documentation/Splunk/4.3.4/Knowledge /…
4. Спасибо, Джоран, я пытался заставить его работать, но не сразу, поэтому я пытался разобраться в этом, прочитав документацию python на os.system и т.д. но затем xiaomao уже опубликовал решение, которое сработало. Спасибо за усилия.
Ответ №1:
Использование Popen
из модуля подпроцесса:
import sys
from subprocess import Popen
output = subprocess.Popen(['php', 'path/to/script.php'] sys.argv[1:], stdout=subprocess.PIPE).communicate()[0]
sys.argv[1:]
содержит все аргументы командной строки, кроме имени самого скрипта python.
Комментарии:
1. В вашем коде не указан PHP-скрипт для выполнения, и он выводит все выходные данные, когда PHP-скрипт завершается.
2. @xiaomao: насколько я понял вопрос, OP хочет получить весь вывод из PHP-скрипта.
3. Я думаю, что это лучшая идея для вывода в реальном времени. Но дело не в этом. Ваш код в корне неверен.
subprocess.Popen
в этом случае даже не является допустимым идентификатором.4. Спасибо knittl, я попробовал это и действительно обнаружил, что мне пришлось переключить импорт Popen из подпроцесса на импорт Popen из подпроцесса, но затем каким-то образом все равно получил синтаксическую ошибку в * sys.argv[1:], пытаясь ее отладить. И затем решение xiaomao уже было опубликовано, которое работает. Еще раз спасибо.
Ответ №2:
Используя subprocess.call
:
import sys, subprocess
sys.exit(subprocess.call(['php', sys.argv[0].replace('.py', '.php')] sys.argv[1:]))
Редактировать: заставил скрипт Python вернуть значение, возвращенное скриптом PHP.
Комментарии:
1. Спасибо, это делает трюк мгновенно :-). Теперь мы можем продолжать работать на нашем основном языке, а не слишком сильно смешивать кодовую базу. Это откроет много полезного для splunk, например, если файл журнала содержит user_ID, мы можем заменить его их именами, а затем создавать из него отчеты, которые удобны для пользователя.
2. Можете ли вы также переслать стандартный идентификатор в том же операторе? Что делает его полностью прокси для всех возможных входных данных? (Я только что узнал, что в некоторых случаях splunk также использует stdin …) Что-то вроде добавления ‘ < ‘ sys.stdin.read() Я предполагаю, но не уверен, будет ли это работать со строками и окончаниями строк должным образом. Заранее спасибо.
3. @VinceMeens, я полагаю,
subprocess.call
будет пересылать все потоки (stdin, stdout и stderr), если не указано иное.4. Вы правы… моя ошибка. Я уже записывал stdin в своем скрипте python для его отладки в файл, поэтому он не был перенаправлен. Еще раз спасибо.