php запуск python скрипта
Running a Python script from PHP
I’m trying to run a Python script from PHP using the following command:
exec(‘/usr/bin/python2.7 /srv/http/assets/py/switch.py arg1 arg2’);
However, PHP simply doesn’t produce any output. Error reporting is set to E_ALL and display_errors is on.
Here’s what I’ve tried:
it works perfectly fine while shutdown now doesn’t do anything.
PHP has the permissions to access and execute the file.
EDIT: Thanks to Alejandro, I was able to fix the problem. If you have the same problem, don’t forget that your webserver probably/hopefully doesn’t run as root. Try logging in as your webserver’s user or a user with similar permissions and try to run the commands yourself.
10 Answers 10
Tested on Ubuntu Server 10.04. I hope it helps you also on Arch Linux.
Execute command via shell and return the complete output as a string.
It returns the output from the executed command or NULL if an error occurred or the command produces no output.
In Unix, an executable file that’s meant to be interpreted can indicate what interpreter to use by having a #! at the start of the first line, followed by the interpreter (and any flags it may need).
If you’re talking about other platforms, of course, this rule does not apply (but that «shebang line» does no harm, and will help if you ever copy that script to a platform with a Unix base, such as Linux, Mac, etc).
Just a quick reminder for those trying to use shell_exec on a unix-type platform and can’t seem to get it to work. PHP executes as the web user on the system (generally www for Apache), so you need to make sure that the web user has rights to whatever files or directories that you are trying to use in the shell_exec command. Other wise, it won’t appear to be doing anything.
Запуск скрипта Python из PHP
Я пытаюсь запустить сценарий Python из PHP, используя следующую команду:
exec(‘/usr/bin/python2.7 /srv/http/assets/py/switch.py arg1 arg2’);
Однако PHP просто не производит никакого результата. Отчет об ошибках установлен в E_ALL, а display_errors включен.
Вот что я попробовал:
Однако, если я выполню
он прекрасно работает, в то время как shutdown now ничего не делает.
PHP имеет права доступа к файлу и его выполнения.
EDIT: благодаря Алехандро я смог решить эту проблему. Если у вас такая же проблема, не забывайте, что ваш webserver, вероятно/надеюсь, не работает от имени root. Попробуйте войти в систему как пользователь вашего webserver или пользователь с аналогичными разрешениями и попробуйте выполнить команды самостоятельно.
9 ответов
запуск скрипта python из ArcMap ESRI и вызов другого скрипта python (или, по крайней мере, попытка его вызова) с помощью модуля подпроцесса. Однако системное окно, в котором он выполняется (окно DOS), появляется только очень кратко и достаточно для меня, чтобы увидеть ошибку, но уходит слишком.
Мне нужно продолжать запускать скрипт PHP, но у меня есть проблема, в настоящее время я использую putty для входа на сервер, а затем выполняю код PHP. Когда я закрываю сеанс putty, скрипт останавливает выполнение. Шаги: войдите на сервер с помощью putty запуск скрипта PHP (например) PHP имя файла.
Проверено на Ubuntu сервере 10.04. Я надеюсь, что это поможет вам и в Arch Linux.
Выполните команду через shell и верните полный вывод в виде строки.
Он возвращает выходные данные выполненной команды или NULL, если произошла ошибка или команда не выдает выходных данных.
В файле Python test.py проверьте этот текст в первой строке: (см. shebang explain) :
Просто краткое напоминание для тех, кто пытается использовать shell_exec на платформа типа unix и, похоже, не может заставить ее работать. PHP выполняется как веб-пользователь в системе (обычно www для Apache), поэтому вам необходимо убедиться, что у веб-пользователя есть права на любые файлы или каталоги, которые вы пытаетесь использовать в команде shell_exec. С другой стороны, похоже, что он ничего не делает.
Я рекомендую использовать passthru и обрабатывать выходной буфер напрямую:
У меня есть две машины: 192.168.10.6 (локальная машина), которая имеет мой сценарий php, и 192.168.12.163 (удаленная машина), которая имеет мой сценарий python. Как я могу запустить этот удаленный сценарий python из локального сценария PHP? У меня есть рабочий код для запуска локального скрипта.
файл sudoers: sudo visudo
добавлено исключение: www-data ALL=(ALL) NOPASSWD: ALL
Чтобы уточнить, какую команду использовать в зависимости от ситуации
Мой файл test.py выглядит так. Обратите внимание на другую версию Python:
С php я теперь делаю это:
И вы должны увидеть: Привет, Мир!
Вышеперечисленные методы кажутся сложными. Используйте мой метод в качестве ссылки.
У меня есть эти два файла:
run.php
mkdir.py
run.php
mkdir.py
Это так тривиально, но я просто хотел помочь всем, кто уже последовал предложению Алехандро, но столкнулся с этой ошибкой:
Если кто-то столкнулся с этой ошибкой, то Алехандро необходимо внести небольшое изменение в файл php:
Запуск скрипта Python из PHP
Я пытаюсь запустить сценарий Python из PHP, используя следующую команду:
exec(‘/usr/bin/python2.7 /srv/http/assets/py/switch.py arg1 arg2’);
Однако PHP просто не производит никакого вывода. Для отчетов об ошибках установлено значение E_ALL, а display_errors включен.
Вот что я пробовал:
Однако, если я убегу
он отлично работает, но shutdown now ничего не делает.
PHP имеет разрешения на доступ к файлу и его выполнение.
РЕДАКТИРОВАТЬ: Благодаря Алехандро я смог решить проблему. Если у вас такая же проблема, не забывайте, что ваш веб-сервер, вероятно / надеюсь, не работает от имени пользователя root. Попробуйте войти в систему как пользователь вашего веб-сервера или пользователь с аналогичными разрешениями и попробуйте выполнить команды самостоятельно.
Протестировано на Ubuntu Server 10.04. Надеюсь, это поможет вам и в Arch Linux.
Выполнить команду через оболочку и вернуть полный вывод в виде строки.
Он возвращает результат выполненной команды или NULL, если произошла ошибка или команда не выдает никаких выходных данных.
В файле Python test.py проверьте этот текст в первой строке: (см. Объяснение Shebang) :
Просто напоминание для тех, кто пытается использовать shell_exec на платформе типа unix и не может заставить его работать. PHP выполняется в системе в качестве веб-пользователя (обычно www для Apache), поэтому вам необходимо убедиться, что веб-пользователь имеет права на любые файлы или каталоги, которые вы пытаетесь использовать в команде shell_exec. В противном случае, похоже, он ничего не сделает.
Вызов Python в PHP
У меня есть скрипт Python, который я недавно написал и который я вызываю с помощью командной строки с некоторыми опциями. Теперь я хочу, чтобы очень тонкий веб-интерфейс вызывал этот скрипт локально на моем Mac.
Я не хочу проходить через мелкие проблемы с установкой mod_python или mod_wsgi на моем Mac, поэтому я просто собирался сделать system () или popen () из PHP для вызова скрипта Python.
Есть идеи получше? Заранее спасибо!
9 ответов
В зависимости от того, что вы делаете, system () или popen () может быть идеальным. Используйте system (), если скрипт Python не имеет выходных данных, или если вы хотите, чтобы выходные данные скрипта Python передавались непосредственно в браузер. Используйте popen (), если вы хотите записать данные в стандартный ввод скрипта Python или прочитать данные из стандартного вывода скрипта Python в php. popen () позволит вам только читать или писать, но не обоим. Если вы хотите и то и другое, ознакомьтесь с proc_open (), но с При двусторонней связи между программами нужно быть осторожным, чтобы избежать взаимных блокировок, когда каждая программа ждет, пока другая что-то сделает.
Если вы хотите передать данные, предоставленные пользователем, в скрипт Python, то следует обратить особое внимание на внедрение команд. Если вы не будете осторожны, ваш пользователь может отправить вам данные типа «; evilcommand;» и заставить вашу программу выполнять произвольные команды против вашей воли.
escapeshellarg () и escapeshellcmd () может помочь с этим, но лично мне нравится удалять все, что не является хорошим персонажем, используя что-то подобно
Ваш call_python_file.php должен выглядеть так:
Это выполняет скрипт Python и выводит результат в браузер. В то время как в вашем скрипте Python переменная (sys.argv [1:]) будет вводить все ваши аргументы. Чтобы отобразить argv в виде строки, из которой вытягивает ваш php, так что если вы хотите сделать текстовую область:
Оператор обратной цитаты также позволит вам запускать скрипты Python, используя синтаксис, аналогичный приведенному выше.
В файле python с именем python.py:
В php-файле с именем python.php:
Я делаю такие вещи все время для быстрых и грязных сценариев. Весьма распространено иметь скрипт CGI или PHP, который просто использует system / popen для вызова какой-то внешней программы.
Просто будьте особенно осторожны, если ваш веб-сервер открыт для Интернета в целом. В этом случае обязательно очистите вход GET / POST, чтобы злоумышленники не могли запускать произвольные команды на вашем компьютере.
Вышеуказанные методы кажутся сложными. Используйте мой метод в качестве ссылки.
У меня есть два файла
Здесь я создал HTML-страницу, которая содержит кнопку GO. Всякий раз, когда вы нажимаете эту кнопку, в каталоге, путь которого вы указали, будет создана новая папка.
Если вы хотите выполнить свой скрипт Python на PHP, необходимо выполнить эту команду в вашем PHP-скрипте:
Вы можете запустить скрипт Python через php и выводить данные в браузере.
По сути, вы должны вызывать скрипт python следующим образом:
Вызов python-скрипта из php (проблемы с кодировкой)
Из php вызывал bash-скрипт, и все было хорошо
Скрипт выполнялся на стороне сервера без проблем, но долго.
Переписал его на python’e, скрипт из консоли отлично работает и отображает русские буквы.
Но если его вызывать из php:
То вываливается ошибка:
Traceback (most recent call last): File «/path/start.py», line 250, in print («\u041f\u043e\u0435\u0445\u0430\u043b\u0438 )») UnicodeEncodeError: ‘ascii’ codec can’t encode characters in position 0-6: ordinal not in range(128)
Ошибка напервом встречающемся принте с русскими символами.
В баш скрипте, в начале, прописывал принудительно, что локаль UTF, так как не смотря на header переменные идут не как планировалось, но тут ошибка даже до переменных. Даже если все передаваемые переменные приводить к латинским символам, ругается именно на русские слова в самом скрипте.
Как поступить и как указать принудительно кодировку?
Так же взял python3, который с русскими буквами уже нормально, все равно проблема остается. При этом из консоли все отлично работает.
Конечно, есть желаение переписать весь php на python, но тем не менее, вопрос остается и проблема пока не решилась.
Что-то пока что не получается добиться результата, может не туда смотрю и не то делаю?
но добавил PYTHONIOENCODING в глобальное окружение /etc/profile
Сам файл сделал с таким содержанием
Тот же результат если
Это третий питон, а если второй питон, то проблем с русскими буквами теперь нет.
Получается, как и писали выше, что питон3 берет свою кодировку, но при ятном указании utf-8 все равно не использует ее?
Так же попробовал такой код
вывод в консоли получил
То есть Кодировка ни как не передается
И в браузере ошибки нет и русский текст появиллся. но не писать же там для каждого встречающегося предолжения?
1 ответ 1
Если вывод скрипта перенаправлен, то нужно установить PYTHONIOENCODING переменную окружения:
output.txt содержит € символ, закодированный используя utf-8 кодировку.
По умолчанию, Питон 3 использует кодировку из локали (LC_ALL, LC_CTYPE, LANG), если вывод перенаправлен:
Локаль по умолчанию (поломанные или вообще отсутствующие настройки) подразумевает ascii кодировку (С, POSIX). Поэтому при запуске init-скриптов (сервисы), при заходе по ssh, в cron-скриптах, если необходимо выводить символы вне ascii диапазона, то следует utf-8 локаль выбрать, например, такую как C.UTF-8 (если она доступна на системе) или явно указать PYTHONIOENCODING даже на Python 3. В Python3.7+ где реализованы PEP-538, PEP-540, ситуация улучшилась и UTF-8 используется для ввода/вывода, если локаль C, POSIX, без необходимости указывания PYTHONIOENCODING переменной окружения.
Чтобы установить PYTHONIOENCODING переменную окружения прямо в команде, если sudo используется ( sudo может не сохранять окружение из родительского процесса), можно использовать sudo VAR=value command синтакс:
полностью окружение можно сохранить, если это необходимо, используя:
по соображениям безопасности это команда не для всех пользователей работает.