Я пытаюсь запустить сценарий Python из PHP, используя следующую команду:
exec('/usr/bin/python2.7 /srv/http/assets/py/switch.py arg1 arg2');
Однако PHP просто не производит никакого вывода. Для отчетов об ошибках установлено значение E_ALL, а display_errors включен.
Вот что я пробовал:
- Я использовал
python2
,/usr/bin/python2
аpython2.7
вместо/usr/bin/python2.7
- Я также использовал относительный путь вместо абсолютного, что тоже ничего не изменило.
- Я попытался с помощью команд
exec
,shell_exec
,system
.
Однако, если я убегу
if (exec('echo TEST') == 'TEST')
{
echo 'exec works!';
}
он отлично работает, но shutdown now
ничего не делает.
PHP имеет разрешения на доступ к файлу и его выполнение.
РЕДАКТИРОВАТЬ: Благодаря Алехандро я смог решить проблему. Если у вас такая же проблема, не забывайте, что ваш веб-сервер, вероятно / надеюсь, не работает от имени пользователя root. Попробуйте войти в систему как пользователь вашего веб-сервера или пользователь с аналогичными разрешениями и попробуйте выполнить команды самостоятельно.
Ответы:
Протестировано на Ubuntu Server 10.04. Надеюсь, это поможет вам и в Arch Linux.
В PHP используйте функцию shell_exec :
В файле Python
test.py
проверьте этот текст в первой строке: (см. Объяснение Shebang) :Также файл Python должен иметь правильные привилегии (выполнение для пользователя www-data / apache, если сценарий PHP выполняется в браузере или curl) и / или должен быть «исполняемым». Также все команды в
.py
файле должны иметь правильные привилегии:Взято из руководства по php :
Чтобы сделать исполняемый файл на платформах типа unix :
источник
echo shell_exec("/usr/local/bin/python3 /Users/cyborg/Dev/magic.py");
или:echo shell_exec("/usr/bin/python /Users/cyborg/Dev/magic.py");
Я рекомендую использовать
passthru
и обрабатывать выходной буфер напрямую:источник
Если вы хотите узнать статус возврата команды и получить весь
stdout
вывод, вы можете использоватьexec
:$out
это массив всех строк.$status
это статус возврата. Очень полезно для отладки.Если вы также хотите увидеть
stderr
результат, вы можете поиграть с proc_open или просто добавить2>&1
в свой$command
. Последнего часто бывает достаточно, чтобы все заработало и быстрее «реализовать».источник
Алехандро прибил его, добавив пояснение к исключению (Ubuntu или Debian) - у меня нет представителя, чтобы добавить к самому ответу:
файл sudoers:
sudo visudo
добавлено исключение:
www-data ALL=(ALL) NOPASSWD: ALL
источник
Чтобы уточнить, какую команду использовать в зависимости от ситуации
exec()
- Выполнить внешнюю программуsystem()
- Выполнить внешнюю программу и отобразить результатpassthru()
- Выполнить внешнюю программу и отобразить необработанный выводИсточник: http://php.net/manual/en/function.exec.php
источник
В моем случае мне нужно было создать новую папку в
www
каталоге с именемscripts
. Внутриscripts
я добавил новый файл под названиемtest.py
.Затем я использовал
sudo chown www-data:root scripts
иsudo chown www-data:root test.py
.Затем я перешел в новый
scripts
каталог и использовалsudo chmod +x test.py
.Мой файл test.py выглядит так. Обратите внимание на другую версию Python:
С php я теперь делаю это:
И вы должны увидеть: Hello World!
источник
Вышеупомянутые методы кажутся сложными. Используйте мой метод как ссылку.
У меня есть два файла:
run.php
mkdir.py
Здесь я создал HTML-страницу, содержащую GOкнопку. Каждый раз, когда вы нажимаете эту кнопку, в каталоге, путь к которому вы указали, будет создана новая папка.
run.php
mkdir.py
источник
Это так тривиально, но я просто хотел помочь любому, кто уже последовал предложению Алехандро, но столкнулся с этой ошибкой:
Если кто-то столкнулся с этой ошибкой, то Алехандро необходимо внести небольшое изменение в php-файл:
источник
В духе Алехандро Кироза:
Необходимо добавить Python, а путь не нужен.
источник