Exécution d'un script Python dans Wordpress

13

J'ai une installation WordPress pour un blog personnel et je porte progressivement tous les petits éléments Web que j'ai écrits au fil des années sur des pages du blog.

Une de ces pages est enlace , qui est un simple script python qui renvoie une liste. de mots - je voudrais intégrer ce comportement dans une page wordpress - quelqu'un pourrait-il me diriger dans la bonne direction pour la manière facile de faire tourner une tache de python dans wordpress?

EDITER - en suivant la merveilleuse réponse ci-dessous, j’en ai encore beaucoup, mais malheureusement pas encore tout à fait là ...

J'ai un python qui s'exécute sur le serveur ...

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

et il se trouve dans le même répertoire que le plugin activé ...

Le code python ... qui a le code suivant ...

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

Le 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;
}
    
posée Joe 27.10.2013 - 14:02

3 réponses

17

Vous pouvez utiliser popen() pour lire ou écrire dans un Script Python (cela fonctionne aussi avec n’importe quel autre langage). Si vous avez besoin d’interaction (variables de passage), utilisez proc_open() .

Un exemple simple pour imprimer Hello World! dans un plugin WordPress

Créez le plugin, enregistrez 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;
}

Vous pouvez maintenant utiliser ce shortcode dans l'éditeur de publication avec [python] ou [python file="filename.py"] .

Placez les scripts Python que vous souhaitez utiliser dans le même répertoire que le fichier de plug-in. Vous pouvez également les mettre dans un répertoire et ajuster le chemin dans le gestionnaire de shortcode.

Créez maintenant un script Python complexe comme celui-ci:

print("Hello World!")

Et c’est tout. Utilisez le shortcode et obtenez ce résultat:

  

    
réponse donnée fuxia 27.10.2013 - 14:45
3

J'ai suivi l'exemple de script de la première réponse, mais je n'ai eu aucun résultat ni erreur.

J'ai changé cette ligne:

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

à ceci:

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

et ensuite un message "autorisation refusée".

Sur la console, j'ai exécuté

chmod 777 hello.py

a rafraîchi la page et tout a fonctionné à la perfection.

C’est peut-être le problème que Joe voyait ci-dessus. Je n'ai pas assez de rep pour faire un commentaire, désolé. J'espère que cela aide quelqu'un.

    
réponse donnée thepotoo 06.10.2016 - 02:14
2

Voici un petit script qui utilise proc_open comme indiqué ci-dessus pour envoyer une variable de texte simple à un 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

Ajout de quelques tests en bas pour voir si le fichier python est rwx . Je pense qu'une meilleure façon d'envoyer le argv serait d'utiliser fwrite, mais cela ne fonctionnait pas pour moi après ce tutoriel .

Voici le script Python que j'ai utilisé. Comme indiqué dans les commentaires ci-dessus, quelque chose comme #!/usr/bin/env python peut être nécessaire, selon le serveur.

#!/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
    
réponse donnée MikeiLL 20.05.2014 - 01:28

Lire d'autres questions sur les étiquettes