[php] PHP에서 Python 호출

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

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

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



답변

수행중인 작업에 따라 system () 또는 popen () 이 완벽 할 수 있습니다. Python 스크립트에 출력이 없거나 Python 스크립트의 출력을 브라우저로 직접 이동하려면 system ()을 사용하십시오. Python 스크립트의 표준 입력에 데이터를 쓰거나 PHP에서 Python 스크립트의 표준 출력에서 ​​데이터를 읽으려면 popen ()을 사용합니다. popen ()은 읽기 또는 쓰기 만 허용하지만 둘다는 허용하지 않습니다. 둘 다 원한다면 proc_open ()을 확인하십시오 . 그러나 프로그램 간의 양방향 통신을 사용하면 각 프로그램이 다른 프로그램이 작업을 수행하기를 기다리는 교착 상태를 피하도록주의해야합니다.

사용자가 제공 한 데이터를 Python 스크립트에 전달하려는 경우주의해야 할 가장 큰 것은 명령 주입입니다. 주의하지 않으면 사용자가 “; evilcommand;”와 같은 데이터를 보낼 수 있습니다. 프로그램이 의지에 반하여 임의의 명령을 실행하도록합니다.

escapeshellarg ()escapeshellcmd () 이 도움이 될 수 있지만 개인적으로 나는 다음과 같은 것을 사용하여 알려진 좋은 문자가 아닌 모든 것을 제거하고 싶습니다.

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


답변

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

python.py라는 python 파일에서 :

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

python.php라는 PHP 파일에서 :

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


답변

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


답변

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 스크립트를 실행하고 브라우저에 출력을 표시하는 방법을 방문 하세요.


답변

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

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


답변

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()


답변

가상 환경을 사용하는 경우 (공유 호스팅에서와 같이) Python 경로를 조정해야합니다. 예 : /home/user/mypython/bin/python ./cgi-bin/test.py