PHP에서 Python 호출


82

몇 가지 옵션과 함께 명령 줄을 사용하여 호출하는 최근 작성한 Python 스크립트가 있습니다. 이제 Mac에서이 스크립트를 로컬로 호출하는 매우 얇은 웹 인터페이스를 원합니다.

Mac에 mod_python 또는 mod_wsgi를 설치하는 사소한 문제를 겪고 싶지 않기 때문에 PHP에서 system () 또는 popen ()을 수행하여 Python 스크립트를 호출하려고했습니다.

더 좋은 아이디어가 있습니까? 미리 감사드립니다!

답변:


106

수행중인 작업에 따라 system () 또는 popen () 이 완벽 할 수 있습니다. Python 스크립트에 출력이 없거나 Python 스크립트의 출력을 브라우저로 직접 이동하려면 system ()을 사용하십시오. Python 스크립트의 표준 입력에 데이터를 쓰거나 PHP에서 Python 스크립트의 표준 출력에서 ​​데이터를 읽으려면 popen ()을 사용합니다. 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

C의 execve ()와 같이 셸을 포함하지 않는 솔루션이 없다는 것입니다. 단, fork ()를 먼저 수행하는 대신 별도의 프로세스에서 실행된다는 점이 다릅니다.
Lie Ryan

항상 해결책이 있지만 무언가를 얻으려면 파이썬을 어딘가에서 실행해야합니다. 입력을 기다리는 간단한 파이썬 서비스를 만들거나 어떤 식 으로든 프로그램을 트리거 할 수 있습니다 (예 : Linux inotify). 그런 다음 PHP 확장이 있고 Linux 서버용 로컬 소켓이 있습니다. PHP의 Python은 다른 (비 플러그인)이 항상 Python 주위에 일종의 쉘을 가지고 있기 때문에 최고의 NoShell 솔루션처럼 보입니다.
Sampo Sarrala-codidact.org

27

역 따옴표 연산자를 사용하면 위와 유사한 구문을 사용하여 파이썬 스크립트를 실행할 수도 있습니다.

python.py라는 python 파일에서 :

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

python.php라는 PHP 파일에서 :

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

15

PHP 확장도 있습니다 : Pip-Python in PHP , 시도해 본 적이 없지만 그러한 경우를 위해 북마크에 추가했습니다.


11
"pip"라는 이름은 매우 인기 있고 상당히 표준적인 Python 패키지 관리 도구를 설명하는데도 사용되므로이 PHP 도구에 대한 정말 나쁘고 혼란스럽고 운명적인 이름입니다. 그래서 오랫동안 업데이트되지 않은 것 같습니다.
GregD

2
아직 진행중인 것 같습니다 (불쌍한 이름 선택) github.com/jparise/php-python
benekastah

11

php를 통해 python 스크립트를 실행하고 브라우저에서 출력 할 수 있습니다.

기본적으로 다음과 같이 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);

참고 : Python 코드에서 time.sleep ()을 실행하면 브라우저에 결과가 출력되지 않습니다.

전체 코드가 작동 하려면 PHP에서 Python 스크립트를 실행하고 브라우저에 출력을 표시하는 방법을 방문 하세요.


여기서 상대 및 절대 경로를 지정하는 방법. 기본적으로 내 python 스크립트가 lets say 폴더 아래에 tempmon있고 동일한 폴더에 내 python 스크립트가 있습니다. 나는 응용 프로그램이 바로 복사 할 수 있습니다 휴대 그렇게되고 싶어 tempmon아래에 폴더를 htdocs. 그리고 다른 기계에서도 동일하게 작동해야합니다.
Krishna Oza 2015 년

완벽하게 작동했습니다. 초보자가 더 잘 이해할 수 있도록 열기 및 닫기 php 태그 <? php?>를 추가 할 수 있습니다.
Zaheer

7

나는 빠르고 더러운 스크립트를 위해 항상 이런 종류의 일을한다. 시스템 / popen을 사용하여 외부 프로그램을 호출하는 CGI 또는 PHP 스크립트를 사용하는 것은 매우 일반적입니다.

웹 서버가 전체적으로 인터넷에 개방되어있는 경우 특히주의하십시오. 이 경우 공격자가 컴퓨터에서 임의의 명령을 실행하지 못하도록 GET / POST 입력을 삭제해야합니다.


3

call_python_file.php는 다음과 같아야합니다.

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

이것은 python 스크립트를 실행하고 결과를 브라우저에 출력합니다. 파이썬 스크립트에서 (sys.argv [1 :]) 변수는 모든 인수를 가져옵니다. 텍스트 영역을 수행하려면 PHP가 가져 오는 모든 위치에 대한 문자열로 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


0

위의 방법은 복잡해 보입니다. 내 방법을 참조로 사용하십시오.

이 두 파일이 있습니다

run.php

mkdir.py

여기에서는 GO 버튼이 포함 된 html 페이지를 만들었습니다. 이 버튼을 누를 때마다 경로를 언급 한 디렉토리에 새 폴더가 생성됩니다.

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

PHP에서 Python 스크립트를 실행하려면 php 스크립트에서 다음 명령을 수행해야합니다.

exec('your script python.py')

A) 스페이스 프로그램 호출이 시도, 즉 매개 변수를 구분 your매개 변수로 scriptpython.py. b) Python 스크립트에 적절한 shebang이 없으면 Python 인터프리터를 호출하고 스크립트 이름을 전달해야합니다 ( python script.py). 적절한 shebang ./script.py을 사용하더라도 통역사 이름을 사용하는 대신 호출 할 수 있으므로 잘못된 것 입니다.
Tox
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.