грешка при използване на 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
Благодаря ви за отговора, но аз просто искам да видя Hello World в моя браузър. Мисля, че трябва да работи, но... - person phucle; 14.10.2011
comment
да print изпраща изхода към STDOUT потока на процеса. Вероятно това ще се окаже STDOUT на PHP процеса, който може да е в журнал на Apache. Ако искате да изпратите този поток и да го изпратите до браузъра, ще трябва да го заснемете. Трябва да разберете, че python print и php echo са много различни. PHP изпраща 'echo' изход към 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 от командния ред, вие изпълнявате един процес и ехото отива към stdout. Но работейки на сървър, изходът трябва да отиде до съответната HTTP заявка/отговор. Не мога да си направя труда да го разгледам, но си представям, че PHP процесът вероятно е нишков, обслужващ няколко едновременни заявки на процес. Не могат всички да споделят един и същ STDOUT! Така че echo/STDOUT вероятно е специален случай за CLI. - person Joe; 17.10.2011