【问题标题】:Python Script Failing to Execute from PHP exec()Python 脚本无法从 PHP exec() 执行
【发布时间】:2013-03-13 18:17:12
【问题描述】:

我有一个简单的 PHP 函数,它应该在调用 Pyton 脚本时执行。我在我的 php 程序中多次尝试过这种函数,但不知何故,这次这个函数根本没有执行 python 脚本。当我从命令提示符访问脚本并运行 python testing.py 时,它会成功执行。我想提一提的是,这个脚本对 python 的 NLTK 库有一些重要的实现,并且需要 20 多秒来执行和执行其操作(即数据处理和存储到 db)。执行中的延迟是导致此问题的原因,还是这次我还缺少其他东西?

function success(){
   $mystring = exec('python testing.py');
   $mystring;
   if(!$mystring){

        echo "python exec failed";
            }
   else{
   echo "<br />";
   echo "successfully executed!";
   }

【问题讨论】:

  • 您是否启用了错误报告?
  • 是的,但什么也没发生。它一直在回应 python exec 失败(正如它应该做的那样)。但是一旦我进入命令行并执行脚本,它就会被执行。
  • 在 php 配置文件中禁用 exec 是很常见的。先试试这个问题看看是不是这样:*.com/questions/3938120/check-if-exec-is-disabled
  • 您应该将您的问题更新为 actual 问题,您在对@lenik 的回答的评论中指出:更多关于此脚本及其时间量需要处理,即超过 20 秒。所以,我的问题实际上是php中是否有一些功能,它等待脚本执行一段固定的时间,然后无论脚本执行成功还是失败都向前移动??
  • @Mike exec() 已启用。

标签: php python


【解决方案1】:

exec() 或任何东西都没有问题。
问题是 nltk 模块无法找到 nltk_data 目录。因为它只需找到 nltk_data 在系统中的位置:通常是 ~/nltk_data。
现在在运行函数时导入添加该路径。
导入 nltk;
现在,nltk.data.path 是搜索模块的位置列表。
你可以这样做 nltk.data.path.append("your location/directory");

【讨论】:

    【解决方案2】:

    您必须为python 和您的文件使用完整路径。你可能会从which python 命令中找到前者,它很可能输出'/usr/bin/python',你应该已经知道后者。所以你的命令看起来像这样:

    $mystring = exec('/usr/bin/python /home/user/testing.py');
    

    并且您应该确保您的 python 脚本具有所有适当的权限,因为您的网络服务器很可能以不同的用户身份运行,因此权限应该是“-rwxrwxr-x”或类似的。

    【讨论】:

    • 我在这里要强调的一点是,我尝试通过确切的函数 success() 运行一个简单的脚本并且它有效。它更多地是关于这个脚本和处理时间,即超过 20 秒。所以,我的问题实际上是php中是否有一些功能,它等待脚本执行一段固定的时间,然后无论脚本执行成功还是失败都向前移动??
    • 另外,确保exec被允许。
    • PHP 有某种限制,例如 30 秒,您可以通过调用 phpinfo() 并在输出中搜索 max_execution_time 轻松找到。如果需要,可以使用ini_set('max_execution_time', 1200); 将其从脚本更改为更高的值,并且您可以从这个问题中获得有关max_execution_time 的其他详细信息:*.com/questions/4220413/…
    • 如果我没记错的话(我可能记错了),在执行外部命令或sleep 时,除了在 Windows 机器上之外,它不计入执行时间。
    【解决方案3】:

    尝试删除 $mystring;

    function success() {
       $mystring = exec('python testing.py');
       if(!$mystring){
           echo "python exec failed";
       } else {
           echo "<br />";
           echo "successfully executed!";
       }
    }
    

    出于测试目的尝试:

    function success() {
       $mystring = exec('python testing.py', $output);
       var_dump($output);
    }
    

    【讨论】:

    • 好眼力,但我认为它实际上不会影响它:codepad.viper-7.com/KT2UDx
    • @khan 返回的脚本是什么?您可以存储输出以检查... exec('python testing.py', $output) - 我更新了答案以显示我在说什么。
    • @doitlikejustin 我认为在这种情况下var_dump 是首选
    • 我可以让脚本返回一些东西,但关键是我刚刚用这个执行了一个小的 python 脚本并且它被执行了。只有这个脚本(需要大量时间才能执行)实际上并没有从 php exec 执行。我怀疑 PHP 没有因为某些内存大小限制或其他原因执行脚本,因为脚本至少需要 20 多秒才能完全执行自身。
    • 设置 60 秒的时间限制然后... php.net/manual/en/function.set-time-limit.php
    【解决方案4】:

    尝试使用 python 程序的确切路径。

    $mystring = exec('python testing.py');
    

    【讨论】:

    • 它在同一个存储库/文件夹中..可直接访问。
    • exec('/usr/bin/python testing.py');