shell — Не удается получить доступ к Python NLTK с помощью PHP

Я пытаюсь вызвать из моего php-файла файл python, содержащий токенайзер предложений / слов:

$output = shell_exec('python tokenizer.py $sentence')

Я пробовал один exec, полные пути к python и tokenizer.py, упаковка $sentence в двойных кавычках. Но по логике, это не должно быть проблемой, потому что вызов print(1) в начале питона код питона перед использованием любых пакетов nltk марки $output равен «1». Итак, я пришел к выводу, что проблема здесь заключается в самом nltk, как путь к модулям не является правильным или что-то …

Но вызов python из оболочки с помощью той же команды, что и выше, дает мне полностью токенизированный вывод! В заключение: похоже, что при вызове python из php волшебным образом «выключается» nltk, в то время как он полностью работает при запуске из оболочки.

Вот часть кода Python, который я использую:

import sys
import nltk
from nltk.tokenize import sent_tokenize

sample_text2 = sys.argv[1]
gust = sent_tokenize(sample_text2)
#print(1) here doesn't work, but everywhere above (before calling sent_tokenize) it does.

Сервер работает на CentOS (Linux), я получаю к нему доступ через SSH.

Очевидный вопрос: что я делаю не так с PHP? Или вообще? Есть альтернативы?

РЕДАКТИРОВАТЬ
Как видно из ответа dvhh и его комментариев, ситуация возникла потому, что на сервере было установлено две версии (2.6 и 2.7), а www пользователь имел доступ к 2.6 и через консоль, по умолчанию была версия 2.7. Решением было изменить Python по умолчанию на 2.7 для обоих случаев и поместить модули nltk в одну из папок зависимостей. (Или добавьте каталог зависимостей, используя sys.path.append)

0

Решение

Ваш PHP-скрипт выполняется www пользователь.

  • Вы можете проверить, если python интерпретатор скрипта вызывается правильно, он обычно находится в одном из PATH переменная окружения (например, /usr/bin/python), но www пользователь не имеет PATH переменная окружения установлена.
    Решение указать весь путь к вашему python переводчик в вашем shell_exec вызов (также укажите полный путь к вашему сценарию, когда вы на нем)

  • Как насчет пути nltk библиотека установлена, вы можете проверить, если python переводчик будет правильно искать это, глядя на sys.path во время бега python с www пользователь.
    диагностика : использовать shell_exec вызов, чтобы запустить скрипт Python для печати sys.path ценности
    Решение : добавить путь к библиотеке sys.path в вашем скрипте Python до import nltk

Это были бы наиболее очевидные решения, учитывая информацию, представленную в вопросе.

Обновить :
Поскольку установлена ​​версия Python 2 (на которой не установлена ​​библиотека), рекомендуется указать путь к нужному интерпретатору. Первое решение поможет исправить проблему.
В Unix как система я бы рекомендовал использовать which python Команда для определения пути вашего интерпретатора Python по умолчанию.

1

Другие решения

Опция 1

Установите простой Python http-сервер, прослушивающий на локальном хосте. Этот старый ответ может помочь, но есть много хау. Преимущество заключается в том, что у вас нет лишних затрат на запуск интерпретатора Python каждый раз, когда нужно выполнить ntlk, и вам не нужно беспокоиться о выполнении сценариев оболочки, разрешениях и т. Д. Недостатком является небольшая дополнительная работа и немного накладных расходов

Вариант 2
Использование очереди задач. Что бы ни говорили и ни делали, небезопасно выполнять команды из ваших веб-скриптов. Если вы уже используете RabbitMQ или что-то подобное, вы можете использовать это здесь. Или же, если вы используете redis, вы можете использовать методы lpush, rpop, чтобы redis вел себя как очередь. Недостаток: результат не всегда доступен.

Вариант 3

Еще одна стратегия для вашего php-скрипта заключается в том, чтобы вводить данные в таблицу и настраивать ваш python-скрипт для запуска в качестве задания cron для проверки таблицы раз в минуту. Недостаток: результат не всегда доступен.

Вариант 4

Ваш текущий выбор, но, пожалуйста, убедитесь, что вы правильно экранировали данные @lafor, если выбрана эта опция, ответ @dvhh должен работать.

1

По вопросам рекламы [email protected]