Я пытаюсь вызвать из моего 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)
Ваш 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
Установите простой Python http-сервер, прослушивающий на локальном хосте. Этот старый ответ может помочь, но есть много хау. Преимущество заключается в том, что у вас нет лишних затрат на запуск интерпретатора Python каждый раз, когда нужно выполнить ntlk, и вам не нужно беспокоиться о выполнении сценариев оболочки, разрешениях и т. Д. Недостатком является небольшая дополнительная работа и немного накладных расходов
Вариант 2
Использование очереди задач. Что бы ни говорили и ни делали, небезопасно выполнять команды из ваших веб-скриптов. Если вы уже используете RabbitMQ или что-то подобное, вы можете использовать это здесь. Или же, если вы используете redis, вы можете использовать методы lpush, rpop, чтобы redis вел себя как очередь. Недостаток: результат не всегда доступен.
Вариант 3
Еще одна стратегия для вашего php-скрипта заключается в том, чтобы вводить данные в таблицу и настраивать ваш python-скрипт для запуска в качестве задания cron для проверки таблицы раз в минуту. Недостаток: результат не всегда доступен.
Вариант 4
Ваш текущий выбор, но, пожалуйста, убедитесь, что вы правильно экранировали данные @lafor, если выбрана эта опция, ответ @dvhh должен работать.