Esecuzione di uno script Python in wordpress


19

Ho un'installazione WordPress per un blog personale e sto gradualmente trasferendo tutti i piccoli bit web che ho scritto negli anni su pagine del blog.

Una di queste pagine è http://www.projecttoomanycooks.co.uk/cgi-bin/memory/majorAnalysis.py che è un semplice script Python che restituisce un elenco di parole - Mi piacerebbe incorporare quel comportamento all'interno di una pagina wordpress - qualcuno potrebbe indicarmi la giusta direzione per il modo più semplice di gestire una macchia di pitone all'interno di wordpress?

EDIT - seguendo la meravigliosa risposta qui sotto, ho molto di più ... ma sfortunatamente non ancora del tutto lì ...

Ho Python che viene eseguito sul server ...

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

ed è nella stessa directory del plugin attivato ...

Il codice Python ... che ha il seguente codice ...

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

Il 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;
}

1
Se è uno script molto semplice, penso che lo riscriverei in PHP come plugin / modello di WordPress ;-) Ma in alcuni casi le persone usano iframe per incorporare pagine esterne.
birgire,

iframe direttamente? :]
Jesse,

È solo un incidente o il tuo codice Python è davvero mischiato a PHP?
fuxia

Ho incollato la traccia terminale, con i file visualizzati dal comando 'more' ... riordinerò un po '...
Joe

Risposte:


20

Puoi usare popen()per leggere o scrivere su uno script Python (funziona anche con qualsiasi altra lingua). Se hai bisogno di interazione (passando variabili) usa proc_open().

Un semplice esempio per stampare Hello World! in un plugin per WordPress

Crea il plugin, 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;
}

Ora puoi usare quel shortcode nell'editor dei post con [python]o [python file="filename.py"].

Inserisci gli script Python che desideri utilizzare nella stessa directory del file plugin. Puoi anche metterli in una directory e regolare il percorso nel gestore di shortcode.

Ora crea uno script Python complesso come questo:

print("Hello World!")

E questo è tutto. Usa lo shortcode e ottieni questo output:

inserisci qui la descrizione dell'immagine


La risposta corretta omette che la prima riga dello script Python, almeno nel mio caso, deve essere #! / Usr / bin / env python
MikeiLL,

1
@MikeiLL Dipende dal sistema dell'utente, quindi l'ho lasciato deliberatamente fuori.
fuxia

fondamentalmente facendo un buco nella sicurezza. Se puoi eseguire il pipe su Python, puoi anche eseguire il pipe su qualsiasi altro processo e questo può essere utilizzato per intensificare qualsiasi exploit più banale.
Mark Kaplun,

3

Ho seguito lo script di esempio dalla prima risposta, ma non ho riscontrato output o errori.

Ho cambiato questa linea:

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

a questo:

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

e poi ha ricevuto il messaggio "permesso negato".

Sulla console, ho corso

chmod 777 hello.py

ha aggiornato la pagina e tutto ha funzionato perfettamente.

Questo potrebbe essere il problema che Joe stava vedendo sopra. Non ho abbastanza rappresentante per fare un commento, scusa. Spero che questo aiuti qualcuno.


Non rendere il permesso 777. Fallo solo eseguirlo. chmod +x filename.pyfarà
Tessaracter il

2

Ecco un piccolo script che utilizza proc_opencome indicato sopra, per inviare una semplice variabile di testo a uno script 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

Aggiunti alcuni test in fondo per vedere se il file Python è rwx. Penso che un modo migliore di inviare argvsarebbe usare fwrite, ma non ha funzionato per me seguendo questo tutorial .

Ecco lo script Python che ho usato. Come notato nei commenti sopra, #!/usr/bin/env pythonpotrebbe essere necessario qualcosa di simile , a seconda del 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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.