Вызов функции php из python

выполнение скрипта 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 или наоборот – если аргументы поддерживаемого типа )

Читайте также:  Decoding xml in java

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 скрипта передать при вызове внешней программы в эту программу.

Эксперт Python

Н-да. Я понял так: сайт на 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 скрипт и от туда-же записать их в бд

Эксперт 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)

Источник

Оцените статью