如何从PHP正确运行Python脚本

时间:2016-09-02 17:00:43

标签: php python permissions shell-exec

我有一个PHP脚本,它将包含Python脚本的存档解压缩到一个目录中,str_replaces脚本中的一些内容,shell_exec是脚本,然后取消链接脚本。

解压缩存档或将内容chmodding到0755没有问题。我可以通过终端执行生成的脚本,它们按预期执行,但是没有任何反应!

我已经尝试在我的shell_exec中指定Python的绝对路径,并在Python文件中指定shebang无效。似乎没有语法错误或未满足的依赖项。我在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 个答案:

答案 0 :(得分:0)

我将专注于这一行:

shell_exec('python '.$TempScript.' -i '.$CTD);
  1. 似乎没有定义$CTD
  2. 不要使用-i标志,因为它会强制执行python提示。
  3. 尝试使用exec()代替更好的调试。
  4. 如果它不能帮到你,请告诉我它输出的内容。

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