Ejecutando un script de Python dentro de wordpress
-
-
Sies un scriptmuy simple,creo que simplemente lo reescribiríaen PHP como un complemento/plantilla de WordPress ;-) Peroen algunos casos lagente usaiframesparaincrustarpáginasexternas.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 directamente?:]iframe it directly? :]
- 0
- 2013-10-27
- Jesse
-
¿Esesto solo un accidente o su código de Pythonestá realmentemezclado con PHP?Is this just an accident, or is your python code really mixed with PHP?
- 0
- 2013-11-05
- fuxia
-
Peguéel seguimiento de laterminal,con los archivos que semuestran conel comando 'más' ... se ordenarán unpoco ...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 respuestas
- votos
-
- 2013-10-27
Puede utilizar
popen()
para leer o escribiren una secuencia de comandos de Python (estotambiénfunciona con cualquier otroidioma). Sinecesitainteracción (pasando variables) useproc_open()
.Unejemplo sencilloparaimprimir ¡Holamundo! en un complemento de WordPress
Creeel complemento,registre un código corto:
<?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; }
Ahorapuede usarese código cortoen eleditor depublicaciones con
[python]
o[python file="filename.py"]
.Coloque los scripts de Python que desea usaren elmismo directorio queel archivo del complemento. Tambiénpuedeponerlosen un directorio y ajustar la rutaen elmanejador de shortcode.
Ahora cree una secuencia de comandos de Python compleja comoesta:
print("Hello World!")
Yesoestodo. Utiliceel código corto y obtengaeste resultado:
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:
-
La respuesta correcta omite laprimera línea del script de Python,almenosen mi caso,debe ser #!/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 Eso depende del sistema del usuario,así que lo omití deliberadamente.@MikeiLL That depends on the user’s system, so I left it out deliberately.
- 1
- 2014-05-20
- fuxia
-
básicamente haciendo un agujero de seguridad.Sipuede canalizar a Python,tambiénpuede canalizar a cualquier otroproceso yestopuede usarseparaescalar cualquierexploitmástrivial.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 sí,estanoes unabuenaidea.Para haceresto "correctamente",tendrá que haber unescape de comandosentrando y unescape de JavaScript + PHP.Estanoes unabuenaforma de desarrollarnada dentro de WordPress,amenos queexista una razón MUYespecíficapara hacerlo."Sus -científicos-programadoresestabantanpreocupadospor sipodían ono,queno se detuvieron apensar si deberían hacerlo".@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
Seguíel script deejemplo de laprimera respuesta,perono obtuve resultados oerrores.
Cambiéesta línea:
$handle = popen( __DIR__ . '/' . $data['file'], 'r' );
aesto:
$handle = popen( __DIR__ . '/' . $data['file'] . ' 2>&1', 'r' );
y luego recibió unmensaje de "permiso denegado".
En la consola,ejecuté
chmod 777 hello.py
actualizó lapágina ytodofuncionó a laperfección.
Estepuede serelproblema que Joeestaba viendo anteriormente.Notengo suficiente representantepara hacer un comentario,lo siento.Espero queesto ayude a alguien.
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.
-
No otorgueelpermiso 777. Simplemente hágaloejecutable.`chmod + xfilename.py` servirá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
Aquí hay unpequeño script que usa
proc_open
como seindicó anteriormente,paraenviar una variable detexto simple a un script de 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
Se agregaron algunaspruebas alfinalpara ver siel archivo de Pythones
rwx
. Creo que unamejormanera deenviarelargv
sería usarfwrite,peronome funcionó siguiendo estetutorial .Aquíestáel script de Python que utilicé. Como se señalóen los comentarios anteriores,algo como
#!/usr/bin/env python
puede sernecesario,dependiendo del servidor.#!/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
Tengo unainstalación de WordPresspara unblogpersonal ygradualmenteestoytrasladandotodos lospequeñosbits web que heescrito a lo largo de los años a laspáginas delblog.
Una deesaspáginases http://www.projecttoomanycooks.co. uk/cgi-bin/memory/majorAnalysis.py ,quees un script de Python simple que devuelve una lista depalabras. Megustaríaincrustarese comportamientoen unapágina de wordpress. ¿Podría alguien señalarmeen la dirección correctapara ¿Laformamásfácil deejecutar un lugar de Pythonen wordpress?
EDITAR: siguiendo lamaravillosa respuesta a continuación,tengomuchomás ...pero desafortunadamentetodavíano he llegado ...
Tengo Python que seejecutaen el servidor ...
yestáen elmismo directorio queel complemento activado ...
El código de Python ... quetiene el siguiente código ...
Elphp: