выполнение скрипта Python на PHP и обмен данными между двумя


Возможно ли запустить скрипт Python в PHP и передавать переменные друг от друга?

У меня есть класс, который обрабатывает веб-сайты для получения данных определенным глобальным способом. я хочу сделать это намного более конкретным, и у меня уже есть сценарии pythons, специфичные для нескольких веб-сайтов.

Я ищу способ включить их в свой класс.

Возможна ли безопасная и надежная передача данных между ними вообще? если да, то насколько сложно получить что-то подобное уходишь?

 21
Author: Lee Taylor, 2012-12-27

4 answers

Как правило, вы можете обмениваться данными между языками, используя общеязыковые форматы и используя stdin и stdout для передачи данных.

Пример с PHP/Python, использующим аргумент оболочки для отправки исходных данных через JSON

PHP:

// 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);

Python:

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 = {'status': 'Yes!'}

# Send it to stdout (to PHP)
print json.dumps(result)
 54
Author: Tom van der Woerdt, 2012-12-27 00:41:10

Вы ищете "межпроцессное взаимодействие" (IPC) - вы могли бы использовать что-то вроде XML-RPC, который в основном позволяет вызывать функцию в удаленном процессе и обрабатывает перевод всех типов данных аргументов между языками (таким образом, вы можете вызывать функцию PHP из Python или наоборот - при условии, что аргументы имеют поддерживаемый тип)

Python имеет встроенный сервер XML-RPC и клиент

Библиотека phpxmlrpc имеет как клиент, так и сервер

Существуют примеры как для сервера Python, так и для клиента , а также для PHP-клиента и сервера

 10
Author: dbr, 2012-12-27 01:22:27

Лучше всего запустить python в качестве подпроцесса и захватить его выходные данные, а затем проанализировать их.

$pythonoutput = `/usr/bin/env python pythoncode.py`;

Использование JSON, вероятно, помогло бы упростить как создание, так и синтаксический анализ на обоих языках, поскольку он стандартный, и оба языка поддерживают его (ну, по крайней мере, не древние версии). В Python,

json.dumps(stuff)

, А затем в PHP

$stuff = json_decode($pythonoutput);

Вы также можете явно сохранить данные в виде файлов, или использовать сокеты, или иметь множество различных способов сделать это более эффективным (и многое другое сложный) в зависимости от конкретного сценария, который вам нужен, но это самый простой.

 1
Author: Amadan, 2012-12-27 00:41:28

Просто у меня была такая же проблема, и я хотел поделиться своим решением. (внимательно следит за тем, что предлагает Амадан)

Кусок питона

import subprocess

output = subprocess.check_output(["php", path-to-my-php-script, input1])

Вы также можете сделать: blah = ввод1 вместо того, чтобы просто отправлять неназванный аргумент... а затем используйте $_GET['бла'].

Фрагмент Php

$blah = $argv[1];



if( isset($blah)){

    // do stuff with $blah

}else{
    throw new \Exception('No blah.');
}
 1
Author: fchaubard, 2013-08-28 17:08:35