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

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

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

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

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

5 ответов

Решение

Как правило, вы можете общаться между языками, используя общие языковые форматы и используя 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)

Вы ищете "межпроцессное взаимодействие" (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{
    throw new \Exception('No blah.');
}

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

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

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

json.dumps(stuff)

а потом в PHP

$stuff = json_decode($pythonoutput);

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

Для меня escapeshellarg(json_encode($data))дает не совсем строку в формате json, а что-то вроде {имя: Карл, возраст: 23}. Итак, в питоне мне нужно .replace(' ', '"')пробелы, чтобы получить реальный json и иметь возможность бросить json.loads(sys.argv[1])в теме.

Проблема в том, что когда кто-то вводит имя, в котором уже есть пробелы, например «Ca rl».

Другие вопросы по тегам