Вызов Python в PHP


У меня есть скрипт Python, который я недавно написал, что я вызываю с помощью командной строки с некоторыми опциями. Теперь я хочу, чтобы очень тонкий веб-интерфейс вызывал этот скрипт локально на моем Mac.

Я не хочу проходить через незначительные проблемы установки mod_python или mod_wsgi на моем Mac, поэтому я просто собирался сделать system() или popen() из PHP, чтобы вызвать скрипт Python.

идеи получше? Заранее спасибо!

8 73

8 ответов:

в зависимости от того, что вы делаете, system () или popen () может быть идеальным. Используйте system (), если скрипт Python не имеет выходных данных, или если вы хотите, чтобы выходные данные скрипта Python шли непосредственно в браузер. Используйте popen (), если вы хотите записать данные в стандартный ввод скрипта Python или прочитать данные из стандартного вывода скрипта Python в php. popen() позволит вам только читать или писать, но не оба. Если вы хотите оба, проверьте proc_open (), но с двусторонняя связь между программами вам нужно быть осторожным, чтобы избежать тупиков, где каждая программа ждет, пока другая что-то сделает.

Если вы хотите передать пользовательские данные в скрипт Python, то большая вещь, о которой нужно быть осторожным, - это инъекция команд. Если вы не будете осторожны, ваш пользователь может отправить вам данные, такие как"; evilcommand; " и заставить вашу программу выполнять произвольные команды против вашей воли.

escapeshellarg() и escapeshellcmd() может помочь с этим, но лично мне нравится удалять все, что не является известным хорошим персонажем, используя что-то вроде

preg_replace('/[^a-zA-Z0-9]/', '', $str)

оператор backquote также позволит вам запускать скрипты python, используя аналогичный синтаксис выше

в файле python называется python.py:

hello = "hello"
world = "world"
print hello + " " + world

в php-файле под названием python.php:

$python = `python python.py`;
echo $python;

есть также расширение PHP: Pip-Python в PHP, который я никогда не пробовал, но он был заложен для такого случая

вы можете запустить скрипт python через php и выводить его в браузере.

в основном вы должны вызвать скрипт python таким образом:

$command = "python /path/to/python_script.py 2>&1";
$pid = popen( $command,"r");
while( !feof( $pid ) )
{
 echo fread($pid, 256);
 flush();
 ob_flush();
 usleep(100000);
}
pclose($pid);

Примечание: Если вы запустите любое время.sleep () в вашем коде python он не будет выводить результаты в браузере.

для работы с полными кодами посетите Как выполнить скрипт python из php и показать вывод в браузере

Я делаю такие вещи все время для быстрых и грязных сценариев. Это довольно часто, чтобы иметь CGI или PHP скрипт, который просто использует system / popen для вызова какой-то внешней программы.

просто быть очень осторожны, если ваш веб-сервер открыт для интернета в целом. Обязательно санируйте свой вход GET/POST в этом случае, чтобы не позволить злоумышленникам запускать произвольные команды на вашем компьютере.

ваш call_python_file.PHP должен выглядеть так:

<?php
    $item='Everything is awesome!!';
    $tmp = exec("py.py $item");
    echo $tmp;
?>

это выполняет скрипт python и выводит результат в браузер. В то время как в вашем скрипте python (sys.argv [1:]) переменная введет все ваши аргументы. Чтобы отобразить argv в виде строки для того, где ваш php тянет из so, если вы хотите сделать текстовую область:

import sys

list1 = ' '.join(sys.argv[1:])

def main():
  print list1

if __name__ == '__main__':
    main()

обратите внимание, что если вы используете виртуальную среду (как в общем хостинге), то вы должны настроить свой путь к python, например:/home/user/mypython/bin/python ./cgi-bin/test.py

Если вы хотите выполнить свой скрипт Python на PHP, необходимо выполнить эту команду в своем скрипте php:

exec('your script python.py')