Вызов Python из PHP с помощью Shell exec


Мое веб-приложение по умолчанию основано на PHP. Однако для удобства я построил скрипт на python, который выполняет некоторый анализ. Теперь мне нужен php, чтобы вызвать код python и получить вывод, который предоставляет код python. Оба файла находятся на одном сервере, но не в одной папке. Мой текущий подход, который не работает, выглядит следующим образом:

$cmd = "/usr/bin/python /var/www/include/sCrape.py -u '$my_url' ";
$response = shell_exec($cmd);
$response = json_decode($response, true);

Теперь, когда я пытаюсь распечатать $response, я получаю нулевой объект (он должен возвращать строку массива, которую я должен декодировать через json_decode). Я делаю что-то не так с функцией? Php находится в каталоге /var / www / html/. Следующий код работает, когда оба файла находятся в одном каталоге:

$cmd = "python sCrape.py -u '$my_url'";
$response = shell_exec($cmd);
$response = json_decode($response, true);

Дополнительная информация: my_url вводится как очищенная переменная $_POST из php, но теперь я попытался полностью отключить очистку, чтобы проверить, будет ли она работать, но это все равно не сработало (тем не менее, путь url-адреса до тех пор, пока он не достигнет функции, длиннее, так как он должен быть передан через form-post, тогда как в моем случае же-папки-тест, я просто объявили $my_url). постфикс-u означает, что скрипт вводит url-адрес.

Заранее большое вам спасибо!

1 2

1 ответ:

Вы пробовали запустить /usr/bin/python /var/www/include/sCrape.py -u '$my_url' в оболочке? Ошибка, вероятно, есть.

Попробуйте:

$cmd = "/usr/bin/python /var/www/include/sCrape.py -u '$my_url' 2>&1";
$response = shell_exec($cmd);
echo $response;

Это должно вывести сообщение об ошибке.

Почему?

shell_exec возвращает только вывод из стандартного вывода (stdout), если возникает ошибка, то она записывается "в" стандартную ошибку (stderr). 2>&1 перенаправляет stderr в stdout. Смотрите в оболочке, что означает "2>&1"?.

Запуск кода python

Вы можете добавить #!/usr/bin/env python в первую строку вашего скрипта python и сделайте его исполняемым chmod +x /var/www/include/sCrape.py. После этого вы сможете запустить свой скрипт без явного вызова python. /var/www/include/sCrape.py -u '$my_url'