выполнение скрипта Python в PHP и обмен данными между двумя
Можно ли запускать скрипт Python в PHP и передавать переменные друг от друга?
У меня есть класс, который обрывает сайты для данных определенным глобальным способом. я хочу, чтобы он стал намного более конкретным и уже имел скрипты pythons, характерные для нескольких веб-сайтов.
Я ищу способ включить тех, кто находится внутри моего класса.
Возможна ли безопасная и надежная передача данных между двумя? если да, то как трудно получить что-то подобное?
Обычно вы можете общаться между языками, используя общие языковые форматы, и использовать stdin и stdout для передачи данных.
Пример с PHP / Python с использованием аргумента оболочки для отправки исходных данных через JSON
// This is the data you want to pass to Python $data = array('as', 'df', 'gh'); // Execute the python script with the JSON data $result = shell_exec('python /path/to/myScript.py ' . escapeshellarg(json_encode($data))); // Decode the result $resultData = json_decode($result, true); // This will contain: array('status' => 'Yes!') var_dump($resultData);
import sys, json # Load the data that PHP sent us try: data = json.loads(sys.argv[1]) except: print "ERROR" sys.exit(1) # Generate some data to send to PHP result = # Send it to stdout (to PHP) print json.dumps(result)
Вы ищете «межпроцессное общение» (IPC) – вы можете использовать что-то вроде XML-RPC, которое в основном позволяет вызывать функцию в удаленном процессе и обрабатывает перевод всех типов данных аргументов между языками (чтобы вы могли вызывать функцию PHP из Python или наоборот – если аргументы поддерживаемого типа )
Python имеет встроенный XML-RPC-сервер и клиент
Библиотека phpxmlrpc имеет как клиент, так и сервер
Существуют примеры как для сервера Python, так и для клиента , а также для клиента и сервера PHP
У меня была такая же проблема, и я хотел поделиться своим решением. (следует за тем, что предлагает Амадан)
кусок питона
import subprocess output = subprocess.check_output(["php", path-to-my-php-script, input1])
вы также можете сделать: blah = input1 вместо того, чтобы просто отправить неназванный аргумент … и затем использовать $ _GET [‘blah’].
часть php
$blah = $argv[1]; if( isset($blah))< // do stuff with $blah >else
Лучше всего запустить python в качестве подпроцесса и захватить его вывод, а затем разобрать его.
$pythonoutput = `/usr/bin/env python pythoncode.py`;
Использование JSON, вероятно, поможет упростить как производство, так и анализ на обоих языках, поскольку оно стандартно, и оба языка поддерживают его (ну, по крайней мере, не древние версии). В Python,
$stuff = json_decode($pythonoutput);
Вы также можете явно сохранять данные в виде файлов или использовать сокеты или иметь много разных способов сделать это более эффективным (и более сложным) в зависимости от точного сценария, который вам нужен, но это самый простой.
Вызов php-функции из Python
Появился такой вопрос: есть у меня, к примеру, php файл (something.php), внутри которого есть несколько функций (пусть все они будут с параметрами):
#пример одной функции function get_something($smth1, $smth2)
Потом в Python пишу вот так:
def get_rate_stars_message(smth1, smth2): p = subprocess.call(["php", "/путь/к/файлу/something.php"]) script_response = subprocess.check_output(["php", "/путь/к/файлу/something.php"])
Вот тут, собственно, я и остановился.
Файл читается, все хорошо, но как вызвать функцию function get_something($smth1, $smth2) и передать ей параметры?
Ответы (3 шт):
Никак не вызывать. Поместить код функции в отдельный файл, и вызывать его целиком. Параметры в файле принимать через $argv
Ну или если так прям хочется несколько функций в файле, то опять же, имя функции передавать первым параметром и вызывать
$func = $argv[1]; if (!in_array($func, array('foo', 'bar'))) die ('Undefined function'); $func($argv[2],$argv[3]);
function get_something($smth1, $smth2)
$func = argv[1] echo $func(argv[2],argv[3])
def get_rate_stars_message(smth1, smth2): args=[«/usr/bin/php»,»/home/user/something.php»,»smth1″,»smth2″] data = subprocess.check_output(args, universal_newlines=True) print(data)
import os, sys, subprocess, json def is_json(myjson): try: json_object = json.loads(myjson) except ValueError as ve: return False return True def getPopen(f): p = os.popen(f) rezult = p.read().strip() if is_json(rezult): return json.loads(rezult) else: return rezult phpinput = getPopen("/. /my.php arg1 arg2") print(phpinput)
Блог
Мы используем 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:
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 для его отладки в файл, поэтому он не был перенаправлен. Еще раз спасибо.
Как из php скрипта передать значение в python и получить результат в этот же php скрипт
Нам с товарищем в универе задали выполнить работу, а именно написать матричный калькулятор, я создал frontend https://webinclude.site/ (похвастаюсь), а он занялся back-end, со мной всё понятно, но вот он работал на python, всё бы ни чего, но я понятия не имею как все это связать, я хорошо знаю php. Мудрит мне нужно из за того что нужно (тавтология) в бд сохранить историю привязанную к ip, а это значить (в моём случае) что браузер должен обратиться к моему php скрипту, он в свою очередь должен вызвать python скрипт передав ему два массива и код операции (целочисленное значение) а тот должен вернет результат в вызвавший его php скрипт, после чего данные отправятся в бд и пользователю
Я очень прошу вас показать на самых примитивных составленных вами примерах как это сделать, а дальше я уже разберусь, только прошу вас хоть и примитивно но подробно. Заранее спасибо
Результат JS скрипта выводится в консоль. как передать его в php
очередной дурацкий вопрос. Результат работы JS скрипта выводится в консоль ….
Как передать значение input date в этот скрипт и потом вывести результат?
Скрипт определения дня недели по дате почти готов, почти работает, но как передать переменную даты.
Передать значение из php скрипта в исполняемый файл
суть такова. нужно значение из php скрипта передать при вызове внешней программы в эту программу.
Н-да. Я понял так: сайт на php, пользователь вводит там данные, и они (внезапно!) должны быть обработаны python. Всё верно?
Жесть. Хотите пример, вот вам пример: пусть питон слушает сокет и принимает задачи по протоколу http в формате json.
В php берёте данные, сериализуете их в json и делаете post-запрос питону. Он считает и отправляет обратно данные тоже в json.
База данных не подходит, её придётся постоянно мониторить одной из сторон.
Добавлено через 1 минуту
P.s. у тебя кнопка «вычислить» не работает. Хоть бы данные на сервер какие отправлял при нажатии.
Добавлено через 2 часа 47 минут
Пример: 400 Bad Request
Всё правильно но я не знаю как на уровне кода всё это реализовать, вот моя идея, индексный файл на php, при первом обращении браузера данный индексный файл должен пробит бд на предмет наличия данных связанных с данным ip, после чего подставить все найденные данные в нужные места (если таковые существуют), далее при работе с сайтом пользователь нажмет на кнопку вычислить и отправить новые не просчитанные данные на сервер (в фоне аякс-ом), далее там на сервере эти данные встретит другой php скрипт (скажем akt.php) после чего он внесёт ip в бд (естественно после проверки на существования данного ip), а самы матрицы должны отправиться далее в python скрипт (скажем matrix.py), тот должен вернуть уже просчитанные данные в этот-же скрипт для того чтобы сохранить их в бд и отправить пользователю обратно в виде ответа. Моя самая больша проблема в том что я не знаю python а учить его времени нет, и в пятницу сдавать проект, чорт бы его побрал я не знаю как отправить на сервер переменные сразу в python скрипт и от туда-же записать их в бд
Сообщение было отмечено владикНЕвладик как решение
Решение
Сразу две проблемы:
1) на одном ip могут сидеть несколько пользователей.
2) «самы матрицы должны отправиться далее в python скрипт» — для этого тебе придётся проверять БД на наличие новых данных. Даже с частотой 1 раз в секунду — это глупо.
Выкинь базу и сделай общение двух скриптов через порт.
Или попробуй позапускать питоновский скрипт так:
passthru('python script.py 4 3 1 2 3 4 5 6 7 8 9 10 11 12 x 3', $err);
Добавлено через 3 минуты
Данные можно передавать не через аргументы, а через переменные окружения:
$cmd='echo "output=$FOO/$BAR"'; $cmd="FOO=bar;BAR=baz;" . $cmd; print ">> $cmd\n"; passthru($cmd);
$value = array(1,2,3,4); $json = json_encode($value); passthru("JSON=$json python script.py");
import os from json import JSONDecoder json = os.getenv('JSON') value = JSONDecoder().decode(json) print(value)