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

#php #python #exec

#php #python #exec

Вопрос:

Я пытаюсь вызвать простой скрипт 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. После того, как я это сделал, проблема решена. Большое спасибо за вашу помощь!

Комментарии:

1. вы уверены, что файл запущен? maby попробуйте создать файл журнала из скрипта python, а также myfile. py будет ищется по текущему пути, по которому выполняется ваш php-скрипт, вы уверены, что файл находится на этом пути. и, наконец, вы не должны возвращать значение ошибки в исполняющую его оболочку, php проигнорирует результаты, учитывая, что оператор не удался (попробуйте вернуть 1 в файле python)

2. Добавьте $output и $status <?php echo exec("script path",$output,$status); ?> $output будет содержать все, что создается скриптом python $status будет содержать любые коды ошибок (0 означает отсутствие ошибок) tldp.org/LDP/abs/html/exitcodes.html

Ответ №1:

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

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

Таким образом, вы можете получить весь вывод.

 exec("/usr/local/python25/bin/python myfile.py 2>amp;1", $output);
print_r($output);
  

Комментарии:

1. То, что я получил в своем браузере, было точно таким -> «Array ()».

Ответ №2:

Здесь очевидный момент, но можете ли вы запустить скрипт 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>amp;1", $output);

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

?>
  

Комментарии:

1. Спасибо, что ответили на мой вопрос. Но снова в моем браузере ничего не появилось. Это означало отсутствие ошибок, но команда exec не была выполнена.

2. Итак, что вы получаете? Пустая страница или Array () ? Кроме того, попробуйте добавить строки ini_set('display_errors',1); error_reporting(-1); в начало скрипта…

Ответ №3:

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

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

Комментарии:

1. Спасибо за ответ, но я просто хочу увидеть «hello world» в своем браузере. Я думаю, что это должно сработать, но…

2. ДА. Вывод print отправляется в поток стандартного вывода процесса. Вероятно, это будет стандартный вывод процесса PHP, который может быть в журнале Apache. Если вы хотите отправить этот поток и отправить его в браузер, вам нужно будет его захватить. Вы должны понимать, что python print и php echo очень сильно отличаются. PHP отправляет вывод «echo» в HTTP-поток. Python отправляет его в стандартный вывод.

3. @Joe Так что насчет использования echo в cli?

4. @Joe: Извините, но я пытался перейти с exec(…) на passthru(…), но все равно не сработало.

5. @xdazz — Прошло много времени с тех пор, как я писал PHP, но учтите следующее: когда вы запускаете PHP из командной строки, вы запускаете один процесс, и echo переходит в стандартный вывод. Но при запуске на сервере вывод должен идти на соответствующий HTTP-запрос / ответ. Я не могу потрудиться разобраться в этом, но я полагаю, что процесс PHP, вероятно, является потоковым, обслуживая несколько одновременных запросов на процесс. Не все они могут использовать один и тот же стандартный вывод! Так что echo / STDOUT, вероятно, является особым случаем для CLI.