【问题标题】:How to properly run a Python script from PHP如何从 PHP 正确运行 Python 脚本
【发布时间】:2017-01-10 20:52:36
【问题描述】:

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

我在解压存档或将内容更改为 0755 时没有问题。我可以通过终端执行生成的脚本,它们按预期执行,但使用 PHP 没有任何反应!

我尝试在我的 shell_exec 和 Python 文件中的 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 行,我的问题已经缩小到这个范围。谢谢!

【问题讨论】:

  • 您是否尝试过 php 是否可以执行任何脚本?在某些服务器上,shell_exec 被禁用。 PHP 是否显示任何错误?
  • PHP 可以执行 shell_exec。我在脚本的其他地方证明了这一点,即使在这部分代码中,解压缩存档的 shell_exec 也可以正常工作。返回的唯一错误是我编程在 Python 脚本未输出文件时抛出的错误。该项目的其余部分可以在github.com/zelon88/HRCloud2找到。

标签: php python permissions shell-exec


【解决方案1】:

我将专注于这一行:

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

【讨论】:

  • 感谢您的回复!我似乎没有收到任何表明 $CTD 已定义的错误。它确实在脚本前面提到过。我输入了你给我的代码并将 shell_exec 更改为 exec。我仍然必须尝试删除 -i,但问题在于它是我的 Python 脚本的一个参数,它指定了输入文件。接下来我会尝试删除它。您给我的代码的输出是... int(1) array(0) { } 但我也从脚本中得到一个错误,即未生成输出文件。
  • 你得到了返回码1。这意味着python脚本以错误结束,但输出为空。 python脚本中是否有任何异常可以抑制错误?另外,这里的噪音太大了。您能否用尽可能少的代码复制您的代码示例?尝试也包含您的 python 脚本。
猜你喜欢
  • 2015-04-21
  • 1970-01-01
  • 1970-01-01
  • 2013-11-13
  • 2012-06-11
  • 2014-10-27
  • 2016-04-29
相关资源
最近更新 更多