ошибка при использовании exec() для вызова скрипта python

Я пытаюсь вызвать простой скрипт Python

#!/usr/local/python25/bin/python
print "hello world"

из следующего php-скрипта

 <?php
    echo exec("/usr/local/python25/bin/python myfile.py");
    ?>

Но ничего не произошло. Скажите, пожалуйста, что здесь не так? (Я также проверил другую тему, но не смог решить свою проблему)

Решенный вопрос: я забыл дать разрешение на доступ к /usr/local/python25/bin/python. После того, как я это сделал, проблема решилась. Большое вам спасибо за вашу помощь!


person phucle    schedule 14.10.2011    source источник
comment
Вы уверены, что файл запущен? maby попробуйте создать файл журнала из скрипта python, также myfile.py будет искаться по текущему пути, который запускает ваш php-скрипт, вы уверены, что файл находится на этом пути. и, наконец, ваш schipt не должен возвращать значение ошибки оболочке, выполняющей его, php будет игнорировать результаты, учитывая, что оператор не удался (попробуйте вернуть 1 в файле python)   -  person Paul Scheltema    schedule 14.10.2011
comment
Добавьте $output и $status <?php echo exec("script path",$output,$status); ?> $output будет содержать все, что создано скриптом python $status будет содержать любые коды ошибок (0 означает отсутствие ошибок) tldp.org/LDP/abs/html/exitcodes.html   -  person b_dubb    schedule 24.11.2015


Ответы (3)


1. Функция exec просто возвращает последнюю строку из результата команды.
2. Оператор печати в python (кроме python 3) автоматически добавляет новую строку в конце.

Вот почему вы чувствуете, что ничего не произошло.

Таким образом вы можете поймать весь вывод.

exec("/usr/local/python25/bin/python myfile.py 2>&1", $output);
print_r($output);
person xdazz    schedule 14.10.2011
comment
То, что я получил в своем браузере, было именно так -> Array(). - person phucle; 14.10.2011

Здесь вроде очевидный момент, но можете ли вы запустить скрипт python из терминала? Он действительно работает?

Убедитесь, что скрипт может выполняться любым пользователем, работающим под PHP - chmod 777 myfile.py, и просто на всякий случай chmod 777 /usr/local/python25/bin/python. Кроме того, убедитесь, что скрипт python находится в том же каталоге, что и скрипт PHP, что требуется для вашего метода его вызова.

Попробуйте изменить свой PHP-скрипт на это и расскажите мне, что вы видите: (ОТРЕДАКТИРОВАНО)

<?php

  // Path to the python script - either FULL path or relative to PHP script
  $pythonScript = 'myfile.py';

  // Path to python executable  - either FULL path or relative to PHP script
  $pythonExec = '/usr/local/python25/bin/python';

  // Check the file exists and PHP has permission to execute it
  clearstatcache();
  if (!file_exists($pythonExec)) {
    exit("The python executable '$pythonExec' does not exist!");
  }
  if (!is_executable($pythonExec)) {
    exit(("The python executable '$pythonExec' is not executable!"));
  }
  if (!file_exists($pythonScript)) {
    exit("The python script file '$pythonScript' does not exist!");
  }

  // Execute it, and redirect STDERR to STDOUT so we can see error messages as well
  exec("$pythonExec \"$pythonScript\" 2>&1", $output);

  // Show the output of the script
  print_r($output);

?>
person DaveRandom    schedule 14.10.2011
comment
Спасибо за ответ на мой вопрос. Но снова ничего не появилось в моем браузере. Это означало отсутствие ошибок, но команда exec не была выполнена. - person phucle; 14.10.2011
comment
Итак, что вы получаете? Пустая страница или Array ()? Кроме того, попробуйте добавить строки ini_set('display_errors',1); error_reporting(-1); в начало скрипта... - person DaveRandom; 14.10.2011

Если вы хотите захватить стандартный вывод подпроцесса, вы должны использовать passthru

Также вам не нужна первая строка этого скрипта Python, если вы напрямую вызываете интерпретатор Python.

person Joe    schedule 14.10.2011
comment
Спасибо за ответ, но я просто хочу увидеть привет, мир в своем браузере. Я думаю, что это должно работать, но... - person phucle; 14.10.2011
comment
Да. print отправляет вывод в поток STDOUT процесса. Вероятно, в конечном итоге это будет STDOUT процесса PHP, который может быть в журнале Apache. Если вы хотите отправить этот поток и отправить его в браузер, вам нужно будет его захватить. Вы должны понимать, что печать python и эхо php очень сильно отличаются. PHP отправляет вывод «эхо» в поток HTTP. Python отправляет его в STDOUT. - person Joe; 14.10.2011
comment
@Joe А как насчет использования echo в cli? - person xdazz; 14.10.2011
comment
@Joe: Извините, но я пытался перейти с exec(...) на passthru(...), но все равно не работал. - person phucle; 14.10.2011
comment
@xdazz - Прошло много времени с тех пор, как я написал PHP, но учтите следующее: когда вы запускаете PHP из командной строки, вы запускаете один процесс, и эхо переходит в стандартный вывод. Но работая на сервере, вывод должен перейти к соответствующему HTTP-запросу/ответу. Мне неинтересно вникать в это, но я предполагаю, что процесс PHP, вероятно, является многопоточным, обслуживая несколько одновременных запросов на процесс. Они не могут использовать один и тот же STDOUT! Так что echo/STDOUT, вероятно, является особым случаем для CLI. - person Joe; 17.10.2011