2013-07-26 7 views
2

로그 파일 수백 개에 파이썬 스크립트 (로그 파서)를 실행해야하지만 PHP 사용자이기 때문에 디렉토리에서 파일 목록을 가져 오기 위해 작은 PHP 스크립트를 작성할 것이라고 생각했습니다. 파이썬 스크립트는 foreach 루프에서 동적으로 실행됩니다.php에서 system() 또는 passthru()를 사용하여 python 스크립트를 실행해도 출력이 생성되지 않습니다. 왜?

PHP 스크립트의 전체 경로, python 스크립트의 전체 경로를 사용하여 PHP 스크립트에 변수를 설정하고 모든 것이 올바른 것으로 확인했습니다.

<?php 
// batch.php (modified for SO post) 
$python = '/usr/bin/python'; 
$script = '/mnt/data/scripts/the/python/script.py'; 
// $folder contains the full system path to the dir containing 
// the files I need to pass as args to script.py 
$files = scandir($folder); 
foreach($files as $file){ 
    if($file=='..'||$file=='.') 
    { 
     continue; 
    } 
    $system = $python.' '.$script.' '.$folder.$file.' 2>&1'; 
    echo "Running ". $system ."\n"; 
    // I also tried passthru() 
    system($system); 
} 

다음을 내가 얻을 모든 PHP에서 첫 번째 줄

php batch.php 

입니다 않습니다 :

Running /usr/bin/python /mnt/data/scripts/the/python/script.py /path/to/data/file/one.log 
I 스크립트의 출력이 내가 그것을 통해 확인을 실행하기 위해 노력하고있어 에코

파이썬으로 직접 쉘 스크립트 ('실행'이후)에 에코 된 결과를 복사, 붙여 넣기하여 실행할 수 있으며 출력 결과도 문제가 없으므로 PHP 스크립트에 구문 문제가 없음을 알고 있습니다.

PHP 스크립트를 실행할 때 PHP에서 내 echo() 문을 출력하지 않습니다. 단지 거기에 매달려 있습니다. (저의 장기 실행 Python 스크립트가 실제로 작동한다고 생각하지만, 어떻게 말할 지 모르겠습니다.) 오류 로그에는 아무 것도 없으며 Ctrl-C까지 스크립트가 종료되지 않습니다.

exec(), system() 및 passthru()에 대한 토론과 system()을 사용하여 출력물을보아야한다고 말할 수있는 것에 대해 많은 논의를 보았습니다.

이 난

root:~# ps aux | grep php 

와 PHP 스크립트의 다음

root:~# strace -p <process_id> 

로했지만, 내가 할 모든

root:~# strace -p 14232 
Process 14232 attached - interrupt to quit 
read(4, 

주 : 나는 2> & 1을 추가 비트는 this question에서하지만 도움이되지 않았다. 그 아파치를 참조하지만 CLI에서 PHP를 실행하고 있습니다.

참고 : 쉘에서

root:~# echo $PYTHONPATH 

더 출력을 생성하지 않습니다.

무엇이 누락 되었습니까?

+0

코드는 나에게 잘 보이지만, 파이썬 스크립트는 전혀 출력하지 않을 수 있습니까? – hago

+0

@hago 실제로, 몇 시간 후에 실행되는 스크립트를 확인해 보았는데 실제로 스크립트가 실행될 때 출력이 생성됩니다. 현재보고 있지 않은 진행중인 업데이트입니다. 파이썬 스크립트는 정상적인 반향과는 달리 실행 중일 때 stdout에 마술을 일으킨다 고 생각합니다. 나는 그것을 모니터 할 수 있기를 바랬지 만, 적어도 그것이 작동한다고 말할 수 있습니다.어쩌면 나는 파이썬 스크립트를 조금 파고 그것의 효과를 볼 것이다. – phpguru

답변

0

기본적으로 파이썬 버퍼 출력. 스크립트가 너무 일찍 종료되면 (아마도 PHP 스크립트 시간 초과로 인해) 버퍼가 플러시되지 않습니다.

set_time_limit()을 호출하여 제한 시간을 연장하고 환경 변수 PYTHONUNBUFFERED를 비어 있지 않은 문자열로 설정하거나 -u와 함께 python을 실행하십시오.