Chạy một kịch bản python trong wordpress


19

Tôi có cài đặt WordPress cho blog cá nhân và tôi đang dần chuyển tất cả các bit web nhỏ mà tôi đã viết trong nhiều năm qua sang các trang trên blog.

Một trang như vậy là http://www.projecttoomanycooks.co.uk/cgi-bin/memory/majorAnalysis.py là một tập lệnh python đơn giản trả về danh sách các từ - Tôi muốn nhúng hành vi đó vào trang wordpress - ai đó có thể chỉ cho tôi đi đúng hướng cho cách dễ dàng điều hành một điểm của con trăn trong wordpress không?

EDIT - theo câu trả lời tuyệt vời dưới đây, tôi đã có nhiều hơn nữa ... nhưng tiếc là vẫn không hoàn toàn ở đó ...

Tôi có python thực thi trên máy chủ ...

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

và nó nằm trong cùng thư mục với plugin được kích hoạt ...

Mã python ... có mã sau đây ...

#!/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
Nếu đó là một tập lệnh rất đơn giản, tôi nghĩ rằng tôi sẽ chỉ viết lại nó trong PHP dưới dạng plugin / mẫu WordPress ;-) Nhưng trong một số trường hợp, mọi người sử dụng iframe để nhúng các trang bên ngoài.
bạch dương

iframe nó trực tiếp? :]
Jesse

Đây chỉ là một tai nạn, hay mã python của bạn thực sự trộn lẫn với PHP?
fuxia

Tôi đã dán dấu vết thiết bị đầu cuối, với các tệp được hiển thị bằng lệnh 'more' ... sẽ dọn dẹp một chút ...
Joe

Câu trả lời:


20

Bạn có thể sử dụng popen()để đọc hoặc ghi vào tập lệnh Python (điều này cũng hoạt động với bất kỳ ngôn ngữ nào khác). Nếu bạn cần tương tác (truyền biến) sử dụng proc_open().

Một ví dụ đơn giản để in Hello World! trong một plugin WordPress

Tạo plugin, đăng ký một 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;
}

Bây giờ bạn có thể sử dụng shortcode đó trong trình chỉnh sửa bài đăng với [python]hoặc [python file="filename.py"].

Đặt các tập lệnh Python mà bạn muốn sử dụng vào cùng thư mục với tệp plugin. Bạn cũng có thể đặt chúng vào một thư mục và điều chỉnh đường dẫn trong trình xử lý shortcode.

Bây giờ hãy tạo một tập lệnh Python phức tạp như thế này:

print("Hello World!")

Và đó là tất cả. Sử dụng shortcode và nhận đầu ra này:

nhập mô tả hình ảnh ở đây


Câu trả lời đúng bỏ qua dòng đầu tiên của tập lệnh python, ít nhất là trong trường hợp của tôi, cần phải là #! / Usr / bin / env python
MikeiLL

1
@MikeiLL Điều đó phụ thuộc vào hệ thống của người dùng, vì vậy tôi đã cố tình bỏ nó.
fuxia

về cơ bản làm cho một lỗ hổng bảo mật. Nếu bạn có thể chuyển sang python, bạn cũng có thể dẫn đến bất kỳ quá trình nào khác và điều này có thể được sử dụng để leo thang bất kỳ khai thác tầm thường hơn.
Đánh dấu Kaplun

3

Tôi đã làm theo kịch bản ví dụ từ câu trả lời đầu tiên, nhưng không nhận được kết quả hoặc lỗi nào.

Tôi đã thay đổi dòng này:

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

đến đây:

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

và sau đó nhận được một tin nhắn "cho phép từ chối".

Trên bàn điều khiển, tôi chạy

chmod 777 hello.py

làm mới trang, và mọi thứ hoạt động hoàn hảo.

Đây có thể là vấn đề Joe đã thấy ở trên. Tôi không có đủ đại diện để bình luận, xin lỗi. Hy vọng điều này sẽ giúp được ai đó.


Đừng cho phép 777. Chỉ cần làm cho nó thực thi. chmod +x filename.pysẽ làm
Tessaracter

2

Đây là một tập lệnh nhỏ sử dụng proc_opennhư đã lưu ý ở trên, để gửi một biến văn bản đơn giản tới tập lệnh 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

Đã thêm một vài bài kiểm tra dưới cùng để xem tệp python có phải không rwx. Tôi nghĩ rằng một cách tốt hơn để gửi argvsẽ được sử dụng fwrite, nhưng nó không hoạt động đối với tôi theo hướng dẫn này .

Đây là kịch bản python tôi đã sử dụng. Như đã lưu ý trong các bình luận ở trên, một cái gì đó như #!/usr/bin/env pythoncó thể là cần thiết, tùy thuộc vào máy chủ.

#!/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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.