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.

php запустить python скрипт

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 имеет разрешения на доступ к файлу и его выполнение.

РЕДАКТИРОВАТЬ: Благодаря Алехандро я смог решить проблему. Если у вас такая же проблема, не забывайте, что ваш веб-сервер, вероятно / надеюсь, не работает от имени пользователя 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 все равно не использует ее?

Так же попробовал такой код

вывод в консоли получил

То есть Кодировка ни как не передается

И в браузере ошибки нет и русский текст появиллся. но не писать же там для каждого встречающегося предолжения?

php запустить python скрипт

php запустить python скрипт

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 синтакс:

полностью окружение можно сохранить, если это необходимо, используя:

по соображениям безопасности это команда не для всех пользователей работает.

Источник

Если вы решили перейти с PHP на Python, то к чему следует подготовиться

Думали ли вы когда-нибудь о том, что однажды слишком быстро втянулись в веб-программирование на PHP? И вот уже прошло много лет, у вас хороший опыт, и вы не думаете ни о каких других способах „делать“ веб, кроме как на PHP. Может быть, у вас возникают сомнения в правильности выбора, однако непонятно, как найти способ быстро его проверить. А хочется примеров, хочется знать, как изменятся конкретные аспекты деятельности.

Сегодня я попробую ответить на вопрос: «А что если вместо PHP писать на Python?».

Сам я долгое время задавался этим вопросом. Я писал на PHP 11 лет и даже являюсь сертифицированным специалистом. Я научился его «готовить» так, чтобы он работал в точности, как мне надо. И когда я в очередной раз читал на Хабре перевод статьи о том, как всё в PHP плохо, я просто недоумевал. Однако подвернулся случай пересесть на Ruby, а потом и на Python. На последнем я и остановился, и теперь попробую рассказать вам PHP-шникам, как нам питонистам живётся.

php запустить python скрипт

Формат статьи

Наилучший способ познавать новый язык — сравнение с регулярно-используемым, если новый язык не принципиально отличается от текущего. Неплохая попытка сделана на сайте Ruby, но, к сожалению, там мало примеров.

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

Подготовка консолей

Я попытался сделать эту статью интерактивной. Поэтому при прочтении настоятельно рекомендую набирать примеры из неё в консолях. Вам понадобится консоль PHP, а лучше сразу psysh:

И консоль Python. Лучше поставить более удобные варианты bpython или ipython, чем встроенная в язык по умолчанию, так как в них уже есть автодополнение. Но можно и так:

И, чтобы применить изменение прямо сейчас без перезапуска консоли, выполнить:

Сам язык

Основные особенности

Правда, обычно у вас в коде типы перемешиваться не будут и данный эффект не будет мозолить вам глаза. В принципе, когда я писал на PHP, ситуаций когда нестрогая типизация реально помогала, было 1-2 на проект, а так обычно взаимодействовали переменные одного типа.

Философия строгой типизации накладывает свой отпечаток и на обработку ошибок. Например, если функция int должна возвращать целый тип, то она не может вернуть None на строку, из которой нельзя однозначно извлечь этот тип. Поэтому генерируется исключение. Это грозит тем, что всё, что прислал пользователь, надо преобразовывать в нужный тип, иначе вы рано или поздно схватите эксепшн на проде.

Это касается не только стандартных функций, но и некоторых методов для списков, строк, части функций во вспомогательных библиотеках. Обычно питон-разработчик примерно на память помнит, где какое исключение может упасть, и учитывает это. Если не помнит, иногда лазит в код библиотеки, чтобы подсмотреть. Но конечно же иногда бывает, что не все варианты учитываются, и порой пользователи ловят эксепшены на проде. Но поскольку это нечастое явление, и обычно веб-фреймворк присылает их админу на почту автоматически, всё довольно быстро чинится.

Чтобы использовать значения разных типов в одном выражении, вам нужно их преобразовать, для этого есть функции: str, int, bool, long. Ну а для форматирования есть более элегантные конструкции.

Строки

Форматирование

Теперь вам нужно просто переучиться:

Вариантов вроде больше и есть хороший вариант для локализаторов.

Методы строки

Самое главное, что есть в Python и чего не хватает в PHP, — это встроенные методы. Давайте сравним:

А как часто вы делали что-то типа такого?

Поддержка юникода

Ну и наконец юникод. В Python 2 все строки по умолчанию не юникод (В Python 3 — по умолчанию юникод). Но стоит вам подставить магическую букву u вначале строки, как она автоматически становится юникодной. И далее все встроенные (и не встроенные) строковые методы Python будут работать хорошо.

php запустить python скрипт
Подобную нативную поддержку юникода хотели завести в PHP 6, но не осилили.
В PHP, кстати, вы можете воспользоваться MBString function overloading и получить аналогичный эффект, но он отмечен, как устаревший. И вы лишаетесь работы с помощью перегруженных функций с бинарными строками, но вы по прежнему можете работать со строкой как с массивом.

«Сырые» строки

Многие из вас знают чем одиночные кавычки отличаются от двойных:

Что-то подобное есть и в Python. Если подставлять перед строкой литерал r, то это поведение почти аналогично одиночным кавычкам в PHP.

Массивы

Теперь разберёмся с массивом. В PHP вы могли запихнуть в качестве ключей целые числа или строки:

php запустить python скрипт
Несмотря на то что array переводится как массив, в PHP array не обычный массив (то есть список), а ассоциативный (то есть, словарь). Обычный массив в PHP тоже есть, это SPLFixedArray. Он ест меньше памяти, потенциально быстрее, но ввиду сложности объявления и сложности расширения практически не используется.

В Python для массива мы используем 3-4 типа данных:

Импорты

Ещё одна интересная вещь — импорты. Своеобразный альтернативный взгляд на неймспейсы с обязательным использованием.

В PHP ты написал require_once и дальше тебе это доступно, пока жива PHP-шная сессия выполнения. Обычно при использовании CMS люди запихивают всё в классы, а классы располагают в специальных местах, и пишут свою маленькую функцию, которая знает эти места и регистрируют её через spl_autoload_register в самом начале файла.

В питоне каждый файл — своя область видимости. И в нём будет доступно только то, что вы в него подгрузите. По умолчанию доступна только стандартная библиотека питона (около 80 функций). Но давайте лучше на примере:

Допустим, вы сделали файл tools/logic.py

И теперь хотите его использовать в файле main.py. В этой ситуации вам необходимо импортировать или весь файл или нужные вам части в файл, где вы работаете.

И так абсолютно везде. Почти все файлы на питоне начинаются с импортов в текущий файл вспомогательных питонячих объектов: ваших и встроенных библиотек. Это всё равно как если бы функции в PHP вида mysqli_*, pdo_*, memcached_*, а также весь ваш код находились только в неймспейсах, и вам приходилось бы каждый раз их импортировать в каждом файле. Какие преимущества у такого подхода?

Удобно ли каждый раз прописывать импорты? Это зависит от вашего склада ума. Если вам нравится больший контроль над кодом, то вы предпочтёте прописывание импортов, чем их отсутствие. В некоторых командах существует даже своя система правил, описывающих в каком порядке можно подключать внешний код для минимизации циклических импортов до минимума. Если в вашей команде нет таких правил и вы не хотите особо заморачиваться, то можно просто положиться на IDE, которая автоматически проставит импорты для всего, что вы используете. Ну и в довесок: импорты не уникальная особенность питона, в Java и C# тоже есть импорты, вроде никто не жаловался.

Параметры в функции *args, **kwargs

Синтаксис с параметрами по умолчанию в целом похож:

Но порой вам нужна функция под неизвестное количество аргументов. Это может быть: проксирующая функция, логирующая функция или функция для получения сигналов. В PHP, начиная с 5.6, вам доступен следующий синтаксис:

В Python аналогично можно ловить в массив неименнованные и в словарь именованные аргументы:

Соответственно *argslist неименованных аргументов, **kwargsdict именованных аргументов.

Классы

Давайте посмотрим на следующий код:

Какие основные отличия от PHP мы можем выделить:

Стиль кодирования

Не знаю как у вас, а я писал на несколько долгоиграющих проектов и всегда отмечал, что стиль кодирования у разных членов команды разный. Нередко по коду можно понять, кто это писал. И всегда хотелось, чтобы был какой-то стандарт оформления кода для единообразия. И всегда были большие споры при согласовании этого документа внутри команды. Для питона это тоже справедливо, но в меньшей степени, ибо есть рекомендации от людей, в квалификации которых мало кто может сомневаться и советов от которых на первое время хватит:

Версии питона

В PHP новые версии всегда обратно совместимы со старыми, хотя иногда требуется доработка напильником. В питоне есть Python 2 и Python 3. Они не совместимы в лоб, хотя в последнее время разработчики питона дело упростили сильно. Можно сразу писать под две версии, но если используются новые фишки Python 3 типа: встроенной асинхронной поддержки или особенностей нового юникода, то скорее всего ничего не получится. По этой причине вся «тяжёлая промышленность», которая имеет кодовую базу в несколько лет, до сих пор сидит на Python 2.
Разумных причин начинать новый проект на Python 2 на момент 2019 года нет.

Что на что меняется

Вместо выводов

Как понять надо ли оно вам?
Мой способ освоить Python

Если вы разработчик с опытом, то на всё не сильно напрягаясь уйдёт максимум две-три недели.

Обновлено: Мелкие исправления и улучшения (благодаря: dginz, defuz, dsx, Stepanow, Studebecker, svartalf).
Обновлено: Нашлись абстрактные классы (благодаря: yktoo). Так же со временем вам придётся познакомиться с удивительным миром декораторов.
Обновлено в 2018: Особенности распространенности Python 2 и 3.
Обновлено в 2019: Особенности Python 3.8 и англоязычный перевод.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *