Вызов Python в PHP

83

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

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

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

Бенни Вонг
источник

Ответы:

106

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

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

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

preg_replace('/[^a-zA-Z0-9]/', '', $str)
Андру Лувиси
источник
1
Модуль подпроцесса заменен прямым использованием os.Popen [n]. Вы должны использовать это вместо этого.
Nick Stinemates, 04
6
@Nick Stinemates: Мы говорим о функциях PHP;)
Glaslos
Нет ли решений, НЕ использующих оболочку, таких как execve () в C, за исключением того, что он запускается в отдельном процессе вместо того, чтобы сначала использовать fork ().
Lie Ryan
Есть и всегда были решения, но вы должны где-то запускать python, чтобы что-то из этого получить. Вы можете создать простую службу python, которая просто ждет ввода, пока она не появится, или вы можете каким-то образом запустить программу (например, inotify linux), затем есть эти расширения PHP, а затем есть локальные сокеты для серверов Linux. Python в PHP выглядит как лучшее решение NoShell, поскольку у другого (не плагина) всегда будет какая-то оболочка вокруг вашего питона.
Сампо Саррала - codidact.org
27

Оператор обратной кавычки также позволит вам запускать скрипты Python, используя синтаксис, аналогичный приведенному выше.

В файле Python с именем python.py:

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

В файле php с именем python.php:

$python = `python python.py`;
echo $python;
пользователь
источник
15

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

Енобрев
источник
11
Имейте в виду, что имя «pip» также используется для описания чрезвычайно популярного и довольно стандартного инструмента управления пакетами Python, так что это действительно плохое, сбивающее с толку и обреченное имя для этого инструмента PHP. Может поэтому его так долго не обновляли.
GregD
2
Похоже, это все еще продолжается (без плохого выбора имени) github.com/jparise/php-python
benekastah
11

Вы можете запустить скрипт 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);

Примечание: если вы запустите any time.sleep () в своем коде Python, он не выдаст результаты в браузере.

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

Idealmind
источник
Как указать здесь путь относительный и абсолютный. В основном у меня есть сценарий python, который находится в папке, скажем, в папке, tempmonи в той же папке находится мой сценарий python. Я хочу, чтобы приложение было переносимым, поэтому можно просто скопировать tempmonпапку под htdocs. И то же самое должно работать на разных машинах.
Кришна Оза
Отлично сработало. Вы можете добавить открытие и закрытие PHP теги для лучшего понимания для начинающих <PHP?>
Захир
7

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

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

Эли Кортрайт
источник
3

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

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

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

import sys

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

def main():
  print list1

if __name__ == '__main__':
    main()
Азе
источник
0

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

Bob3411
источник
0

Вышеупомянутые методы кажутся сложными. Используйте мой метод как ссылку.

У меня есть два файла

run.php

mkdir.py

Здесь я создал html-страницу, содержащую кнопку GO. Каждый раз, когда вы нажимаете эту кнопку, в каталоге, путь к которому вы указали, будет создана новая папка.

run.php

<html>
 <body>
  <head>
   <title>
     run
   </title>
  </head>

   <form method="post">

    <input type="submit" value="GO" name="GO">
   </form>
 </body>
</html>

<?php
    if(isset($_POST['GO']))
    {
        shell_exec("python /var/www/html/lab/mkdir.py");
        echo"success";
    }
?>

mkdir.py

#!/usr/bin/env python    
import os    
os.makedirs("thisfolder");
SMshrimant
источник
-2

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

exec('your script python.py')
Gouled Med
источник
a) Разделяет параметры пробелами, то есть пытается вызвать программу yourс параметрами scriptи python.py. б) Если скрипт Python не имеет надлежащего shebang, необходимо вызвать интерпретатор Python и передать ему имя скрипта ( python script.py). Даже с правильным shebang это неверно, поскольку вы тогда вызываете ./script.pyвместо использования имени интерпретатора.
Tox