Виклик Python в PHP


83

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

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

Будь-які кращі ідеї? Спасибі заздалегідь!

Відповіді:


106

Залежно від того, що ви робите, система () або 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

6
@ Nick Stinemates: Ми говоримо про функції PHP;)
Glaslos

чи немає рішень, які б НЕ включали оболонку, як execve C), за винятком того, що вона працює в окремому процесі, замість того, щоб спочатку виконувати fork ()
Lie Ryan

Рішення є і завжди були, але ви повинні десь запустити python, щоб щось отримати з нього. Ви можете зробити просту службу python, яка просто чекає на введення, поки вона не з’явиться, або ви можете якось запустити програму (наприклад, linotify inotify), тоді є такі розширення PHP, а потім є локальні сокети для серверів Linux. Python у PHP виглядає найкращим рішенням NoShell, оскільки інші (не плагіни) завжди матимуть якусь оболонку навколо вашого python.
Сампо Саррала - 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);

Примітка: якщо ви запустите будь-який час.sleep () у коді python, він не видасть результати в браузері.

Повні коди працюють на сторінці Як виконати скрипт python з php та показати вихідні дані в браузері


Як вказати шлях тут відносний та абсолютний. В основному у мене є свій сценарій python, який міститься в папці recit, tempmonі ця ж папка містить мій сценарій python. Я хочу, щоб додаток був портативним, щоб можна було просто скопіювати tempmonпапку в htdocs. І те саме повинно працювати на різних машинах.
Кришна Оза,

Чудово працював. Ви можете додати відкриваючі та закриваючі теги php <? Php?> Для кращого розуміння для початківців
Zaheer

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 як рядок для того, звідки тягне ваш php, тому, якщо ви хочете зробити текстову область:

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


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

-2

Якщо ви хочете виконати свій сценарій Python у PHP, необхідно виконати цю команду у вашому php-скрипті:

exec('your script python.py')

а) Відставляє окремі параметри, тобто це намагається викликати програму yourз параметрами scriptта python.py. б) Якщо сценарій Python не має належного шебанга, потрібно викликати інтерпретатор Python і передавати йому ім'я сценарію ( python script.py). Навіть із правильним шебангом це неправильно, оскільки тоді ви зателефонуєте ./script.pyзамість того, щоб використовувати ім'я перекладача.
Токс
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.