Menjalankan skrip python di dalam wordpress

19

Saya memiliki WordPress menginstal untuk blog pribadi dan saya secara bertahap porting semua bit web kecil yang saya tulis selama bertahun-tahun ke halaman di blog.

Salah satu halaman tersebut adalah http://www.projecttoomanycooks.co.uk/cgi-bin/memory/majorAnalysis.py yang merupakan skrip python sederhana yang mengembalikan daftar kata - Saya ingin menanamkan perilaku itu dalam halaman wordpress - bisakah seseorang mengarahkan saya ke arah yang benar untuk cara mudah menjalankan titik python dalam wordpress?

EDIT - mengikuti jawaban yang bagus di bawah ini, saya punya banyak hal lebih lanjut ... tapi sayangnya masih belum cukup ...

Saya punya python yang dijalankan di server ...

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

dan itu ada di direktori yang sama dengan plugin yang diaktifkan ...

Kode python ... yang memiliki kode berikut ...

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

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;
}
Joe
sumber
1
Jika itu skrip yang sangat sederhana, saya pikir saya hanya akan menulis ulang dalam PHP sebagai plugin / template WordPress ;-) Tetapi dalam beberapa kasus orang menggunakan iframe untuk menyematkan halaman eksternal.
birgire
iframe secara langsung? :]
Jesse
Apakah ini hanya kebetulan, atau apakah kode python Anda benar-benar dicampur dengan PHP?
fuxia
Saya menempel jejak terminal, dengan file-file yang ditampilkan oleh perintah 'lebih' ... akan merapikan sedikit ...
Joe

Jawaban:

20

Anda dapat menggunakan popen()untuk membaca atau menulis ke skrip Python (ini juga berfungsi dengan bahasa lain). Jika Anda memerlukan interaksi (lewat variabel) gunakan proc_open().

Contoh sederhana untuk mencetak Hello World! dalam plugin WordPress

Buat plugin, daftarkan kode pendek:

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

Sekarang Anda dapat menggunakan kode pendek itu di editor pos dengan [python]atau [python file="filename.py"].

Masukkan skrip Python yang ingin Anda gunakan ke direktori yang sama dengan file plugin. Anda juga dapat menempatkannya di direktori dan menyesuaikan jalur di penangan kode pendek.

Sekarang buat skrip Python kompleks seperti ini:

print("Hello World!")

Dan itu saja. Gunakan kode pendek, dan dapatkan output ini:

masukkan deskripsi gambar di sini

fuxia
sumber
Jawaban yang benar menghilangkan bahwa baris pertama skrip python, setidaknya dalam kasus saya, harus #! / Usr / bin / env python
MikeiLL
1
@MikeiLL Itu tergantung pada sistem pengguna, jadi saya sengaja membiarkannya.
fuxia
pada dasarnya membuat lubang keamanan. Jika Anda dapat mem-pipe ke python, Anda juga dapat mem-pipe ke proses lain dan ini dapat digunakan untuk meningkatkan eksploitasi yang lebih sepele.
Mark Kaplun
3

Saya mengikuti contoh skrip dari jawaban pertama, tetapi tidak mendapatkan output atau kesalahan.

Saya mengubah baris ini:

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

untuk ini:

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

dan kemudian mendapat pesan "izin ditolak".

Di konsol, saya berlari

chmod 777 hello.py

menyegarkan halaman, dan semuanya bekerja dengan sempurna.

Ini mungkin masalah yang dilihat Joe di atas. Saya tidak punya cukup perwakilan untuk berkomentar, maaf. Semoga ini bisa membantu seseorang.

foto
sumber
Jangan membuat izin 777. Buat saja itu bisa dijalankan. chmod +x filename.pyakan melakukannya
Tessaracter
2

Berikut ini adalah skrip kecil yang menggunakan proc_openseperti disebutkan di atas, untuk mengirim satu variabel teks sederhana ke skrip 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

Menambahkan beberapa tes sebagai bagian bawah untuk melihat apakah file python rwx. Saya pikir cara yang lebih baik untuk mengirim argvakan menggunakan fwrite, tetapi tidak berhasil bagi saya mengikuti tutorial ini .

Berikut ini adalah skrip python yang saya gunakan. Seperti disebutkan dalam komentar di atas, sesuatu seperti #!/usr/bin/env pythonmungkin diperlukan, tergantung pada 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
MikeiLL
sumber