从远程服务器(Debian)上的Laravel控制器运行Python3时出现Symfony / Process异常

时间:2018-09-17 18:22:15

标签: python-3.x laravel symfony symfony-process

我正在尝试执行一个Python脚本(3.6.5),该脚本位于Laravel应用文件夹中的一个文件夹中。从控制器调用该脚本,并检索脚本的输出。我正在使用Symfony / process执行脚本,如下面的代码所示:

public static function searchAnswers($input)
    {
        $process = new Process(array('dir', base_path() . '/app/SearchEngine'));
        $process->setWorkingDirectory(base_path() . '/app/SearchEngine');
        $process->setCommandLine('python3 SearchEngine.py ' . '"'. $input .'"');
        $process->setTimeout(2 * 3600);

        $process->run();  

        if (!$process->isSuccessful()) {            //Executes after the command finishes
            throw new ProcessFailedException($process);
        }

        $list_ids = array_map('intval', explode(' ', $process->getOutput()));
        info($list_ids);
        $solicitations = Solicitation::join('answers', 'solicitations.id', '=', 'answers.solicitation_id')
                            ->whereIn('solicitations.id', $list_ids)
                            ->limit(20)
                            ->get();
        info($solicitations);
        return $solicitations;
    }

在我的本地主机中,无论​​是从终端还是通过HTTP请求从运行的应用程序中调用脚本都没有问题。但是,在将应用程序版本上传到我的远程服务器Debian之后,出现以下异常:

"""
The command "python3 SearchEngine.py "O que é diabetes?"" failed.\n
\n
Exit Code: 1(General error)\n
\n
Working directory: /var/www/plataformaTS/app/SearchEngine\n
\n
Output:\n
================\n
\n
\n
Error Output:\n
================\n
Traceback (most recent call last):\n
  File "/usr/local/lib/python3.4/dist-packages/nltk/corpus/util.py", line 80, in __load\n
    try: root = nltk.data.find('{}/{}'.format(self.subdir, zip_name))\n
  File "/usr/local/lib/python3.4/dist-packages/nltk/data.py", line 675, in find\n
    raise LookupError(resource_not_found)\n
LookupError: \n
**********************************************************************\n
  Resource \e[93mstopwords\e[0m not found.\n
  Please use the NLTK Downloader to obtain the resource:\n
\n
  \e[31m>>> import nltk\n
  >>> nltk.download('stopwords')\n
  \e[0m\n
  Searched in:\n
    - '/var/www/nltk_data'\n
    - '/usr/share/nltk_data'\n
    - '/usr/local/share/nltk_data'\n
    - '/usr/lib/nltk_data'\n
    - '/usr/local/lib/nltk_data'\n
    - '/usr/nltk_data'\n
    - '/usr/share/nltk_data'\n
    - '/usr/lib/nltk_data'\n
**********************************************************************\n
\n
\n
During handling of the above exception, another exception occurred:\n
\n
Traceback (most recent call last):\n
  File "SearchEngine.py", line 20, in <module>\n
    stopwords = stopwords.words('portuguese')\n
  File "/usr/local/lib/python3.4/dist-packages/nltk/corpus/util.py", line 116, in __getattr__\n
    self.__load()\n
  File "/usr/local/lib/python3.4/dist-packages/nltk/corpus/util.py", line 81, in __load\n
    except LookupError: raise e\n
  File "/usr/local/lib/python3.4/dist-packages/nltk/corpus/util.py", line 78, in __load\n
    root = nltk.data.find('{}/{}'.format(self.subdir, self.__name))\n
  File "/usr/local/lib/python3.4/dist-packages/nltk/data.py", line 675, in find\n
    raise LookupError(resource_not_found)\n
LookupError: \n
**********************************************************************\n
  Resource \e[93mstopwords\e[0m not found.\n
  Please use the NLTK Downloader to obtain the resource:\n
\n
  \e[31m>>> import nltk\n
  >>> nltk.download('stopwords')\n
  \e[0m\n
  Searched in:\n
    - '/var/www/nltk_data'\n
    - '/usr/share/nltk_data'\n
    - '/usr/local/share/nltk_data'\n
    - '/usr/lib/nltk_data'\n
    - '/usr/local/lib/nltk_data'\n
    - '/usr/nltk_data'\n
    - '/usr/share/nltk_data'\n
    - '/usr/lib/nltk_data'\n
**********************************************************************\n
\n
"""

该异常指出python脚本中的导入错误。但是,当我直接或通过Artisan命令从远程服务器中的终端执行脚本时,一切正常。有什么想法吗?

谢谢!

1 个答案:

答案 0 :(得分:1)

我找到了解决方法。

错误是lib nltk.stopwords是作为root用户安装的,而我的应用程序正尝试以另一个没有权限的用户身份访问该文件。因此,我以该用户身份登录并再次安装了库。现在,一切都像魔咒一样醒来。