it-swarm.com.de

Ausführen eines Python-Skripts in WordPress

Ich habe eine WordPress-Installation für ein persönliches Blog und portiere nach und nach alle kleinen Webbits, die ich im Laufe der Jahre geschrieben habe, auf Seiten im Blog.

Eine solche Seite ist http://www.projecttoomanycooks.co.uk/cgi-bin/memory/majorAnalysis.py ein einfaches Python-Skript, das eine Liste von Wörtern zurückgibt - ich möchte dieses Verhalten einbetten innerhalb einer WordPress-Seite - könnte mich jemand in die richtige Richtung weisen, um auf einfache Weise einen Punkt Python in WordPress laufen zu lassen?

BEARBEITEN - nach der wunderbaren Antwort unten bin ich viel weiter gekommen ... aber leider immer noch nicht ganz da ...

Ich habe Python, das auf dem Server ausgeführt wird ...

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

und es befindet sich im selben Verzeichnis wie das aktivierte Plugin ...

Der Python-Code ... der den folgenden Code hat ...

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

Die 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;
}
16
Joe

Sie können popen() verwenden, um oder in ein Python-Skript zu schreiben (dies funktioniert auch mit jeder anderen Sprache). Wenn Sie eine Interaktion (Übergabe von Variablen) benötigen, verwenden Sie proc_open() .

Ein einfaches Beispiel, um Hello World! In einem WordPress-Plugin zu drucken

Erstelle das Plugin, registriere einen 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;
}

Jetzt können Sie diesen Shortcode im Post-Editor mit [python] oder [python file="filename.py"] verwenden.

Legen Sie die Python-Skripte, die Sie verwenden möchten, in dasselbe Verzeichnis wie die Plugin-Datei. Sie können sie auch in ein Verzeichnis stellen und den Pfad im Shortcode-Handler anpassen.

Erstellen Sie nun ein komplexes Python-Skript wie folgt:

print("Hello World!")

Und das ist alles. Verwenden Sie den Shortcode und erhalten Sie die folgende Ausgabe:

enter image description here

18
fuxia

Ich habe das Beispielskript von der ersten Antwort an befolgt, aber keine Ausgabe oder Fehler erhalten.

Ich habe diese Zeile geändert:

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

dazu:

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

und bekam dann eine "Erlaubnis verweigert" Nachricht.

Auf der Konsole lief ich

chmod 777 hello.py

hat die Seite aktualisiert und alles hat perfekt funktioniert.

Dies könnte das Problem sein, das Joe oben gesehen hat. Ich habe nicht genug Repräsentanten, um einen Kommentar abzugeben, sorry. Hoffe das hilft jemandem.

3
thepotoo

Hier ist ein kleines Skript, das wie oben erwähnt proc_open verwendet, um eine einfache Textvariable an ein Python-Skript zu senden:

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

Unten wurden einige Tests hinzugefügt, um festzustellen, ob die Python-Datei rwx ist. Ich denke, ein besserer Weg, die argv zu senden, wäre die Verwendung von fwrite, aber es hat bei mir nach diesem Tutorial nicht funktioniert.

Hier ist das Python-Skript, das ich verwendet habe. Wie bereits in den Kommentaren erwähnt, ist je nach Server möglicherweise etwas wie #!/usr/bin/env python erforderlich.

#!/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
2
MikeiLL