Запуск сценарію python в wordpress


19

У мене встановлення WordPress для особистого блогу, і я поступово переношу всі маленькі веб-біти, написані протягом багатьох років, на сторінки в блозі.

Однією з таких сторінок є http://www.projecttoomanycooks.co.uk/cgi-bin/memory/majorAnalysis.py - простий скрипт пітона, який повертає список слів - я хотів би вкласти цю поведінку на сторінку wordpress - хтось міг би вказати мені в правильному напрямку для простого способу запуску плями пітона в wordpress?

EDIT - слідуючи чудовій відповіді нижче, я отримав набагато далі ... але, на жаль, все ще не зовсім там ...

У мене є python, який виконується на сервері ...

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

і він знаходиться в тому ж каталозі, що і активований плагін ...

Код python ... який має такий код ...

#!/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
Якщо це дуже простий сценарій, я думаю, я просто переписав би його в PHP як плагін / шаблон WordPress ;-) Але в деяких випадках люди використовують iframes для вбудовування зовнішніх сторінок.
birgire

iframe це прямо? :]
Джессі

Це просто випадковість, чи ваш код пітона дійсно змішаний з PHP?
fuxia

Я вставив термінальний слід, при цьому файли відображатимуться командою 'more' ... трохи приведуть ...
Джо

Відповіді:


20

Ви можете використовувати popen()для читання або запису до сценарію Python (це працює і з будь-якою іншою мовою). Якщо вам потрібна взаємодія (передача змінних), використовуйте proc_open().

Простий приклад для друку Hello World! у плагіні WordPress

Створіть плагін, зареєструйте короткий код:

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

Тепер ви можете використовувати цей короткий код у редакторі публікацій з [python]або [python file="filename.py"].

Покладіть сценарії Python, які ви хочете використовувати, в ту саму директорію, що і файл плагіна. Ви також можете помістити їх у каталог і відрегулювати шлях у обробнику короткого коду.

Тепер створіть складний сценарій Python таким чином:

print("Hello World!")

І це все. Використовуйте короткий код і отримайте цей вихід:

введіть тут опис зображення


Правильна відповідь заперечує, що перший рядок сценарію python, принаймні в моєму випадку, повинен бути #! /
Usr

1
@MikeiLL Це залежить від користувальницької системи, тому я це навмисно вимикав.
фуксія

в основному зробити отвір для безпеки. Якщо ви можете підключити до python, ви також можете передати будь-який інший процес, і це може бути використане для ескалації будь-якого більш тривіального подвигу.
Марк Каплун

3

Я слідував прикладу сценарію з першої відповіді, але не отримував жодних результатів і помилок.

Я змінив цей рядок:

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

до цього:

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

а потім отримало повідомлення "відмовлено у дозволі".

На консолі я побіг

chmod 777 hello.py

оновив сторінку, і все працювало чудово.

Це може бути питання, яке Джо бачив вище. Мені не вистачає представника, щоб коментувати, вибачте. Сподіваюся, що це комусь допоможе.


Не робіть дозволу 777. Просто зробіть його виконуваним. chmod +x filename.pyзробить
Tessaracter

2

Ось невеликий сценарій, який використовує, proc_openяк було зазначено вище, для того, щоб надіслати одну просту текстову змінну до сценарію 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

Внизу додано кілька тестів, щоб перевірити, чи є файл python rwx. Я думаю, що кращим способом надіслати argvбуде використання fwrite, але це не спрацювало для мене після цього підручника .

Ось сценарій python, який я використав. Як зазначалося в коментарях вище, #!/usr/bin/env pythonможе залежати щось подібне , залежно від сервера.

#!/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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.