WordPress içinde bir Python betiği çalıştırma


19

Kişisel bir blog için WordPress kurulumum var ve yıllar boyunca yazdığım tüm küçük web bitlerini yavaş yavaş blogdaki sayfalara taşıyorum.

Böyle bir sayfa http://www.projecttoomanycooks.co.uk/cgi-bin/memory/majorAnalysis.py bir kelime listesi döndüren basit bir python betiğidir - bu davranışı bir wordpress sayfasına yerleştirmek istiyorum - Birisi wordpress içinde bir nokta python çalıştırmanın easyist yolu için beni doğru yönde gösterebilir mi?

EDIT - aşağıdaki harika cevabı takiben, daha fazla var ... ama ne yazık ki hala tam olarak orada değil ...

Sunucuda çalışan python var ...

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

ve aktif eklenti ile aynı dizinde ...

Aşağıdaki kodu içeren python kodu ...

#!/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;
}

1
Çok basit bir komut dosyasıysa, PHP'de bir WordPress eklentisi / şablonu ;-) olarak yeniden yazacağımı düşünüyorum.Ancak bazı durumlarda insanlar dış sayfaları yerleştirmek için iframe kullanır.
birgire

iframe doğrudan? :]
Jesse

Bu sadece bir kaza mı, yoksa python kodunuz gerçekten PHP ile karışık mı?
fuxia

Terminal izini yapıştırdım, 'more' komutu ile görüntülenen dosyalar ... biraz toparlanacak ...
Joe

Yanıtlar:


20

Bir Python betiğini popen()okumak veya yazmak için kullanabilirsiniz (bu başka bir dilde de kullanılabilir). Etkileşime ihtiyacınız varsa (değişkenleri geçiyor) kullanın proc_open().

Merhaba Dünya'yı yazdırmak için basit bir örnek ! WordPress eklentisinde

Eklentiyi oluşturun, bir kısa kod kaydedin:

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

Şimdi bu kısa kodu yazı düzenleyicide [python]veya ile kullanabilirsiniz [python file="filename.py"].

Kullanmak istediğiniz Python komut dosyalarını eklenti dosyasıyla aynı dizine yerleştirin. Bunları bir dizine ekleyebilir ve kısa kod işleyicideki yolu ayarlayabilirsiniz.

Şimdi şöyle karmaşık bir Python betiği oluşturun:

print("Hello World!")

Ve hepsi bu. Kısa kodu kullanın ve şu çıktıyı alın:

resim açıklamasını buraya girin


Doğru cevap, en azından benim durumumda, python betiğinin ilk satırının #! / Usr / bin / env python olması gerektiğini ihmal eder
MikeiLL

1
@MikeiLL Bu kullanıcının sistemine bağlıdır, bu yüzden kasten dışarıda bıraktım.
fuxia

temelde bir güvenlik deliği açmak. Python'a borulama yapabiliyorsanız, başka herhangi bir işleme de borulama yapabilirsiniz ve bu daha önemsiz istismarları artırmak için kullanılabilir.
Mark Kaplun

3

İlk cevaptan örnek komut dosyasını izledim, ancak çıktı veya hata almıyordum.

Bu satırı değiştirdim:

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

buna:

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

ve sonra "izin reddedildi" mesajı aldım.

Konsolda koştum

chmod 777 hello.py

sayfayı yeniledi ve her şey mükemmel çalıştı.

Joe'nun yukarıda gördüğü sorun bu olabilir. Yorum yapmak için yeterli temsilcim yok, üzgünüm. Umarım bu birine yardımcı olur.


777 iznini vermeyin. Sadece çalıştırınız. chmod +x filename.pyyapacağım
Tessaracter

2

proc_openBir python komut dosyasına basit bir metin değişkeni göndermek için yukarıda belirtildiği gibi kullanılan küçük bir komut dosyası:

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

Altta python dosyasının olup olmadığını görmek için birkaç test eklendi rwx. Ben göndermek için daha iyi bir yol argvfwrite kullanmak olacağını düşünüyorum, ama bu öğretici aşağıdaki benim için çalışma değildi .

İşte kullandığım python betiği. Yukarıdaki yorumlarda belirtildiği gibi #!/usr/bin/env python, sunucuya bağlı olarak benzer bir şey gerekli olabilir.

#!/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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.