2016-09-02 2 views
0

У меня есть скрипт PHP, который распаковывает архив, содержащий скрипты Python, в каталог, str_replaces некоторые вещи внутри скрипта, скрипт shell_exec, а затем отменивает скрипт.Как правильно запустить скрипт Python из PHP

У меня нет проблем с распаковкой архива или chmodding содержимого до 0755. Я могу выполнить сгенерированные скрипты через терминал, и они выполняют как ожидалось, но с PHP ничего не происходит!

Я попытался указать абсолютные пути для Python в моем shell_exec и в shebang в файле Python безрезультатно. По-видимому, нет синтаксических ошибок или неудовлетворенных зависимостей. Я пробовал это со всеми затронутыми каталогами в chmod 0777 безрезультатно. Раздел соответствующего кода выглядит следующим образом ...

if (in_array($oldExtension,$allowed)) { 
    list($Width, $Height) = getimagesize($CUD); 
    $EXFreshScript = $InstLoc.'/Applications/document-scanner-master.zip'; 
    $EXTempScript = $InstLoc.'/DATA/'.$UserID.'/TEMPSCRIPTS'; 
    mkdir($EXTempScript); 
    chmod($EXTempScript, 0777); 
    $ExtractScripts = shell_exec('unzip '.$EXFreshScript.' -d '.$EXTempScript); 
    chmod($EXTempScript.'/document-scanner', 0777); 
    $TempScript = $EXTempScript.'/document-scanner/scan.py'; 
    chmod($EXTempScript.'/document-scanner', 0777); 
    $TempScriptGlob = glob($TempScript); 
    foreach ($TempScriptGlob as $TSG) { 
    chmod($TSG, 0777); } 
    chmod($EXTempScript.'/document-scanner/pyimagesearch', 0777); 
    $TempScript1 = $EXTempScript.'/document-scanner/pyimagesearch'; 
    $TempScriptGlob = glob($TempScript1); 
    foreach ($TempScriptGlob as $TSG) { 
     chmod($TSG, 0777); 
    } 
    $OutputDoc = $InstLoc.'/DATA/'.$UserID.'/DOCSCANTEMP.jpg'; 
    $Code = 'DOCSCANTEMP.jpg'; 
    $newCode = $InstLoc.'/DATA/'.$UserID.'/DOCSCANTEMP.jpg'; 
    $ScriptData = file_get_contents($TempScript); 
    $SwapCode = str_replace($Code, $newCode, $ScriptData); 
    $WriteCode = file_put_contents($TempScript, $SwapCode); 
    $txt = ('OP-Act: Modified the code of '.$TempScript.' with '.$Width.', '.$Height.' on '.$Time.'.'); 
    $LogFile = file_put_contents($SesLogDir.'/'.$Date.'.txt', $txt.PHP_EOL , FILE_APPEND); 
    $txt = ('OP-Act: Executing! '.$TempScript.' on '.$Time.'.'); 
    $LogFile = file_put_contents($SesLogDir.'/'.$Date.'.txt', $txt.PHP_EOL , FILE_APPEND); 
    chmod($TempScript, 0777); 
    shell_exec('python '.$TempScript.' -i '.$CTD); 
    $txt = ('OP-Act: Execute complete! '.$TempScript.' was executed on '.$Time.'.'); 
    $LogFile = file_put_contents($SesLogDir.'/'.$Date.'.txt', $txt.PHP_EOL , FILE_APPEND); 
} 

Если у кого есть какие-либо идеи, которые я бы очень признателен. Сценарий, полученный от этого, имеет длину более 650 строк, и у меня есть проблема, связанная с этим. Благодаря!

+1

Вы пытались, если php может выполнять любой скрипт вообще? На некоторых серверах shell_exec отключен. Есть ли у PHP ошибки? –

+0

PHP может выполнять shell_exec. Я доказал это в другом месте сценария, и даже в этом разделе кода shell_exec, который распаковывает архив, отлично работает. Единственная ошибка, которая возвращается, которую я запрограммировал, чтобы она была выброшена в случае, если сценарий Python не выводил файл. Остальную часть проекта можно найти по адресу https://github.com/zelon88/HRCloud2. – zelon88

ответ

0

я остановлюсь на этой линии:

shell_exec('python '.$TempScript.' -i '.$CTD); 
  1. Похоже $CTD не определен.
  2. Не используйте флаг -i, потому что он обеспечивает выполнение подсказки python.
  3. Попробуйте использовать exec() вместо лучшей отладки.

Если это не поможет, сообщите мне, что он выводит.

$return = NULL; 
$output = []; 
exec('python '.$TempScript, $output, $return); 
var_dump($return); 
var_dump($output); 
+0

Спасибо за ответ! Кажется, у меня нет ошибок, указывающих, что $ CTD определен. Он упоминается ранее в скрипте. Я ввел код, который вы мне дали, и заменил shell_exec на exec. Я все же должен попробовать удалить -i, но проблема в том, что это аргумент для моего скрипта Python, который указал входной файл. Я попытаюсь удалить это в следующий раз. Результат для кода, который вы мне дали, - это ... int (1) array (0) {} Но я также получаю сообщение об ошибке из сценария, что выходной файл не был сгенерирован. – zelon88

+0

У вас есть код возврата 1. Это означает, что скрипт python завершился ошибкой, но вывод пуст. Есть ли какое-либо исключение в скрипте python, которое подавляет ошибки? Кроме того, здесь слишком много шума. Можете ли вы повторить образец кода с наименьшим количеством кода? Попробуйте включить свой скрипт python. –

Смежные вопросы