2013-03-24 8 views
4

У меня есть простая функция PHP, которая должна выполнять скрипт Pyton при его вызове. Я пробовал эту функцию несколько раз в своих php-программах, но как-то на этот раз эта функция вообще не выполняет скрипт python. Когда я получаю доступ к скрипту из командной строки и запускаю python testing.py, он успешно запускается. Одна вещь, которую я хочу упомянуть, что этот скрипт имеет некоторые серьезные реализации библиотеки NLTK python и занимает более 20 секунд для выполнения и выполнения своих операций (т. Е. Процесса обработки данных и хранения в db). Является ли эта задержка в выполнении, которая вызывает эту проблему, или есть что-то еще, что мне не хватает на этот раз?Сценарий Python, не выполняющийся с PHP exec()

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

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

Включили ли вы сообщение об ошибках? – Mike

+0

Да, но ничего не произошло. Он продолжает повторять, что python exec завершился неудачно (как это и предполагалось). Но как только я перехожу в командную строку и выполняю скрипт, он запускается. – khan

+0

Очень часто, что 'exec' отключен в файле конфигурации php. Попробуйте сначала проверить этот вопрос, чтобы убедиться, что это так: http://stackoverflow.com/questions/3938120/check-if-exec-is-disabled – Mike

ответ

7

вы должны использовать полный путь к python и для вашего файла. вы можете найти первое из команды which python, что, скорее всего, выводит «/ usr/bin/python», и вы уже должны знать последнее. так что ваша команда будет выглядеть следующим образом:

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

и вы должны убедиться, что ваш питон скрипт имеет все необходимые разрешения, потому что ваш веб-сервер, скорее всего, работают в качестве другого пользователя, поэтому разрешения должны быть «-rwxrwxr- x "или что-то близкое.

+0

То, что я делаю здесь, это то, что я попробовал запустить простой скрипт через точная функция success(), и это сработало. Его больше об этом скрипте и количестве времени, которое требуется для обработки, то есть более 20 секунд. Итак, мой вопрос на самом деле заключается в том, что есть некоторая функция в php, которая ожидает, что сценарий будет выполняться в течение определенного фиксированного периода времени, а затем движется вперед, независимо от успеха или неудачи выполнения сценария ?? – khan

+0

Кроме того, убедитесь, что 'exec' разрешен. –

+1

У PHP есть какой-то предел, например 30 секунд, который вы можете легко найти из вызова phpinfo() и поиска 'max_execution_time' на выходе. вы можете изменить это из сценария на более высокое значение, если вам нужно, используя 'ini_set ('max_execution_time', 1200);', и вы можете получить другую информацию о 'max_execution_time' из этого вопроса: http: // stackoverflow. com/questions/4220413/how-do-php-max-execute-time-work – lenik

1

попытаться использовать точный путь к программе python.

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

Он находится в том же хранилище/папке .. непосредственно доступный. – khan

+1

exec ('/ usr/bin/python testing.py'); –

+1

пробовал его .. не работает. – khan

0

Попробуйте удалить $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); 
} 
+1

Хороший глаз, но я не думаю, что это на самом деле повлияло бы на это: http://codepad.viper-7.com/KT2UDx – Mike

+1

попробовал ... не работает. – khan

+1

А ... Майк прав:) – doitlikejustin

0

Нет проблем с exec() или чем-либо еще.
Проблема заключается в том, что модуль nltk не может найти каталог nltk_data. Для этого просто найдите где nltk_data присутствует в вашей системе: обычно ~/nltk_data.
Теперь импортируйте этот путь, когда вы запустите функцию.
импорт nltk;
Теперь nltk.data.path - это список мест для поиска модулей.
Вы можете просто сделать nltk.data.path.append («ваше местоположение/каталог»);

Смежные вопросы