Ejecutando un script de python en wordpress

13

Tengo una instalación de WordPress para un blog personal y poco a poco voy a transferir todas las pequeñas páginas web que he escrito a lo largo de los años a páginas del blog.

Una de estas páginas es enlace , que es un simple script de Python que devuelve una lista de palabras, me gustaría integrar ese comportamiento en una página de wordpress, ¿podría alguien dirigirme en la dirección correcta para encontrar la manera más fácil de manejar un lugar de python en wordpress?

EDITAR: siguiendo la maravillosa respuesta a continuación, tengo mucho más futuro ... pero lamentablemente todavía no estoy allí ...

Tengo python que se ejecuta en el servidor ...

projecttoomanycooks server [~/public_html/joereddington/wp-content/plugins]#./hello.py 
Hello World!

y está en el mismo directorio que el complemento activado ...

El código de Python ... que tiene el siguiente código ...

#!/usr/bin/python
print("Hello World!")

El php:

<?php
/**
 * Plugin Name: Joe's python thing.
 * Plugin URI: http://URI_Of_Page_Describing_Plugin_and_Updates
 * Description: A brief description of the Plugin.
 * Version: The Plugin's Version Number, e.g.: 1.0
 * Author: Name Of The Plugin Author
 * Author URI: http://URI_Of_The_Plugin_Author
 * License: A "Slug" license name e.g. GPL2
 */
/*from http://wordpress.stackexchange.com/questions/120259/running-a-python-scri
pt-within-wordpress/120261?noredirect=1#120261  */
add_shortcode( 'python', 'embed_python' );

function embed_python( $attributes )
{
    $data = shortcode_atts(
        array(
            'file' => 'hello.py'
        ),
        $attributes
    );
    $handle = popen( __DIR__ . '/' . $data['file'], 'r');
    $read   = fread($handle, 2096);
    pclose($handle);

    return $read;
}
    
pregunta Joe 27.10.2013 - 14:02

3 respuestas

17

Puede usar popen() para leer o escribir en una Script Python (esto también funciona con cualquier otro idioma). Si necesita interacción (pasando variables) use proc_open() .

Un ejemplo sencillo para imprimir ¡Hola mundo! en un complemento de WordPress

Crea el complemento, registra un 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;
}

Ahora puedes usar ese shortcode en el editor de publicación con [python] o [python file="filename.py"] .

Coloque los scripts de Python que desea usar en el mismo directorio que el archivo del complemento. También puede colocarlos en un directorio y ajustar la ruta en el controlador de código corto.

Ahora crea un script de Python complejo como este:

print("Hello World!")

Y eso es todo. Use el código corto y obtenga esta salida:

  

    
respondido por el fuxia 27.10.2013 - 14:45
3

Seguí el script de ejemplo de la primera respuesta, pero no obtuve resultados ni errores.

He cambiado esta línea:

$handle = popen( __DIR__ . '/' . $data['file'], 'r' );

a esto:

$handle = popen( __DIR__ . '/' . $data['file'] . ' 2>&1', 'r' );

y luego recibió un mensaje de "permiso denegado".

En la consola, corrí

chmod 777 hello.py

actualicé la página y todo funcionó perfectamente.

Este puede ser el problema que Joe estaba viendo arriba. No tengo suficiente representante para hacer un comentario, lo siento. Espero que esto ayude a alguien.

    
respondido por el thepotoo 06.10.2016 - 02:14
2

Aquí hay una pequeña secuencia de comandos que utiliza proc_open como se indicó anteriormente, para enviar una simple variable de texto a una secuencia de comandos 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 algunas pruebas como parte inferior para ver si el archivo de python es rwx . Creo que una mejor manera de enviar argv sería usar fwrite, pero no me funcionó siguiendo este tutorial .

Aquí está el script de python que usé. Como se señaló en los comentarios anteriores, algo como #!/usr/bin/env python puede ser necesario, 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
    
respondido por el MikeiLL 20.05.2014 - 01:28

Lea otras preguntas en las etiquetas