Запуск скрипта Python в wordpress
-
-
Если это очень простой скрипт,я бы просто переписал его на PHP как плагин/шаблон WordPress ;-) Но в некоторых случаях люди используют фреймы для встраивания внешних страниц.If it's a very simple script, I think I would just rewrite it in PHP as a WordPress plugin/template ;-) But in some cases people use iframes to embed external pages.
- 1
- 2013-10-27
- birgire
-
iframe это напрямую?:]iframe it directly? :]
- 0
- 2013-10-27
- Jesse
-
Это просто случайность или ваш код на Python действительно смешан с PHP?Is this just an accident, or is your python code really mixed with PHP?
- 0
- 2013-11-05
- fuxia
-
Я вставил трассировку терминала с файлами,отображаемыми командой 'more' ... немного прибраюсь ...I pasted the terminal trace, with the files being displayed by the 'more' command... will tidy up a little...
- 0
- 2013-11-05
- Joe
-
3 ответ
- голосов
-
- 2013-10-27
Вы можете использовать
popen ()
для читать или писать в скрипт Python (это работает и с любым другим языком). Если вам нужно взаимодействие (передача переменных),используйтеproc_open () код>
.Простой пример печати Hello World! в плагине WordPress
Создайте плагин,зарегистрируйте шорткод:
& lt;?php # - * - кодирование: utf-8 - * - /* Имя плагина: встроенный Python */ add_shortcode ('питон','встраивать_python'); функцияembed_python ($ attributes) { $ data=shortcode_atts ( [ 'файл'=> 'hello.py' ], $ атрибуты ); $ handle=popen (__DIR__. '/'. $ data ['файл'],'r'); $ read=''; пока (!feof ($ handle)) { $ read.=fread ($ handle,2096); } pclose ($ handle); return $ read; }
Теперь вы можете использовать этот шорткод в редакторе сообщений с
[python]
или[pythonfile="filename.py"]
.Поместите скрипты Python,которые вы хотите использовать,в тот же каталог,что и файл плагина. Вы также можете поместить их в каталог и настроить путь в обработчике шорткода.
Теперь создайте сложный скрипт Python следующим образом:
print ("Hello World!")
Вот и все. Используйте шорткод и получите следующий результат:
<цитата>You can use
popen()
to read or write to a Python script (this works with any other language too). If you need interaction (passing variables) useproc_open()
.A simple example to print Hello World! in a WordPress plugin
Create the plugin, register a shortcode:
<?php # -*- coding: utf-8 -*- /* Plugin Name: Python embedded */ add_shortcode( 'python', 'embed_python' ); function embed_python( $attributes ) { $data = shortcode_atts( [ 'file' => 'hello.py' ], $attributes ); $handle = popen( __DIR__ . '/' . $data['file'], 'r' ); $read = ''; while ( ! feof( $handle ) ) { $read .= fread( $handle, 2096 ); } pclose( $handle ); return $read; }
Now you can use that shortcode in the post editor with
[python]
or[python file="filename.py"]
.Put the Python scripts you want to use into the same directory as the plugin file. You can also put them into a directory and adjust the path in the shortcode handler.
Now create a complex Python script like this:
print("Hello World!")
And that’s all. Use the shortcode, and get this output:
-
При правильном ответе первая строка сценарияpython,по крайней мере в моем случае,должна быть #!/Usr/bin/envpythonCorrect answer omits that first line of the the python script, at least in my case, needs to be #!/usr/bin/env python
- 0
- 2014-05-19
- MikeiLL
-
@MikeiLL Это зависит от системы пользователя,поэтому я намеренно исключил его.@MikeiLL That depends on the user’s system, so I left it out deliberately.
- 1
- 2014-05-20
- fuxia
-
в основном делает дыру в безопасности.Если вы можете подключиться кpython,вы можете также подключиться к любому другому процессу,и это можно использовать для эскалации любого более тривиального эксплойта.basically making a security hole. If you can pipe to python, you can pipe to any other process as well and this can be used to escalate any more trivial exploit.
- 1
- 2018-08-15
- Mark Kaplun
-
@MarkKaplun да,это плохая идея.Чтобы сделать это «правильно»,необходимо будет выполнить экранирование команды и экранирование JavaScript + PHP.Это не лучший способ разрабатывать что-либо внутри WordPress,если для этого нет ОЧЕНЬ конкретной причины.«Ваши - ученые - программисты были настолько озабочены тем,могут ли они это сделать,что не останавливались,чтобы подумать,стоит ли им».@MarkKaplun yes, this is not a good idea. To do this "right" there will have to be command escaping going in, and JavaScript+PHP escaping going on. This is not a good way to develop anything inside WordPress, unless there is a VERY specific reason to do this. "Your -scientists- programmers were so preoccupied with whether or not they could, they didn’t stop to think if they should."
- 0
- 2020-01-20
- Brian Stinar
-
- 2016-10-06
Я выполнил пример сценария из первого ответа,но не получал никаких результатов или ошибок.
Я изменил эту строку:
$handle = popen( __DIR__ . '/' . $data['file'], 'r' );
к этому:
$handle = popen( __DIR__ . '/' . $data['file'] . ' 2>&1', 'r' );
,а затем получил сообщение "в разрешении отказано".
На консоли я запустил
chmod 777 hello.py
обновил страницу,и все заработало.
Возможно,это проблема,которую Джо видел выше.У меня недостаточно представителей,чтобы оставить комментарий,извините.Надеюсь,это кому-то поможет.
I followed the example script from the first answer, but was getting no output or errors.
I changed this line:
$handle = popen( __DIR__ . '/' . $data['file'], 'r' );
to this:
$handle = popen( __DIR__ . '/' . $data['file'] . ' 2>&1', 'r' );
and then got a "permission denied" message.
On the console, I ran
chmod 777 hello.py
refreshed the page, and everything worked perfectly.
This may be the issue Joe was seeing above. I don't have enough rep to make a comment, sorry. Hope this helps someone.
-
Не делайте разрешение 777. Просто сделайте его исполняемым.chmod + xfilename.py подойдетDo not make the permission 777. Just make it executale. `chmod +x filename.py` will do
- 0
- 2019-06-25
- Dheeraj M Pai
-
- 2014-05-19
Вот небольшой скрипт,который использует
proc_open
,как указано выше,для отправки одной простой текстовой переменной в скриптpython:add_shortcode( 'execute_python', 'execute_python_with_argv' ); function execute_python_with_argv( $attributes ){ $description = array ( 0 => array("pipe", "r"), // stdin 1 => array("pipe", "w"), // stdout 2 => array("pipe", "w") // stderr ); $application_system = "python "; $application_path .= plugin_dir_path( __FILE__ ); $application_name .= "hello.py"; $separator = " "; $application = $application_system.$application_path.$application_name.$separator; $argv1 = '"output to receive back from python script"'; $pipes = array(); $proc = proc_open ( $application.$argv1 , $description , $pipes ); //echo proc_get_status($proc)['pid']; if (is_resource ( $proc )) { echo "Stdout : " . stream_get_contents ( $pipes [1] ); //Reading stdout buffer fclose ( $pipes [1] ); //Closing stdout buffer fclose ( $pipes [2] ); //Closing stderr buffer $return_value = proc_close($proc); echo "<br/>command returned: $return_value<br/>"; } $application_test = glitch_player_DIR.$application_name; echo "<br/>Is ".$application_test." executable? ".is_executable($application_test)." "; echo "readable? ".is_readable($application_test)." "; echo "writable? ".is_writable($application_test)." "; } //EOF main/shortcode function
Внизу добавлено несколько тестов,чтобы проверить,является ли файлpython
rwx
. Я думаю,что лучший способ отправитьargv
- использоватьfwrite,но у меня он не работал после это руководство .Вот скрипт Python,который я использовал. Как отмечалось в комментариях выше,в зависимости от сервера может потребоваться что-то вроде
#!/usr/bin/env python
.#!/usr/bin/env python from sys import argv script, what_he_said = argv print "This is what you submitted: %s \n \n Isn't that amazing, man? " % what_he_said
Here's a little script that uses
proc_open
as noted above, to sent one simple text variable to a python script:add_shortcode( 'execute_python', 'execute_python_with_argv' ); function execute_python_with_argv( $attributes ){ $description = array ( 0 => array("pipe", "r"), // stdin 1 => array("pipe", "w"), // stdout 2 => array("pipe", "w") // stderr ); $application_system = "python "; $application_path .= plugin_dir_path( __FILE__ ); $application_name .= "hello.py"; $separator = " "; $application = $application_system.$application_path.$application_name.$separator; $argv1 = '"output to receive back from python script"'; $pipes = array(); $proc = proc_open ( $application.$argv1 , $description , $pipes ); //echo proc_get_status($proc)['pid']; if (is_resource ( $proc )) { echo "Stdout : " . stream_get_contents ( $pipes [1] ); //Reading stdout buffer fclose ( $pipes [1] ); //Closing stdout buffer fclose ( $pipes [2] ); //Closing stderr buffer $return_value = proc_close($proc); echo "<br/>command returned: $return_value<br/>"; } $application_test = glitch_player_DIR.$application_name; echo "<br/>Is ".$application_test." executable? ".is_executable($application_test)." "; echo "readable? ".is_readable($application_test)." "; echo "writable? ".is_writable($application_test)." "; } //EOF main/shortcode function
Added a few tests as the bottom to see if the python file is
rwx
. I think a better way to send theargv
would be using fwrite, but it wasn't working for me following this tutorial.Here is the python script I used. As noted in comments above, something like
#!/usr/bin/env python
may be necessary, depending on server.#!/usr/bin/env python from sys import argv script, what_he_said = argv print "This is what you submitted: %s \n \n Isn't that amazing, man? " % what_he_said
У меня установлен WordPress для личного блога,и я постепенно переношу все небольшие веб-фрагменты,которые я написал за эти годы,на страницы этого блога.
Одна из таких страниц - http://www.projecttoomanycooks.co. uk/cgi-bin/memory/majorAnalysis.py ,который представляет собой простой скрипт Python,который возвращает список слов - я бы хотел встроить это поведение на страницу WordPress - может ли кто-нибудь указать мне в правильном направлении для простой способ запустить пятно Python в WordPress?
РЕДАКТИРОВАТЬ - после замечательного ответа ниже у меня есть еще много чего ... но,к сожалению,все еще не совсем так ...
У меня есть питон,который выполняется на сервере ...
и находится в том же каталоге,что и активированный плагин ...
Кодpython ... со следующим кодом ...
PHP: