ใช้งานสคริปต์ไพ ธ อนภายในเวิร์ดเพรส


19

ฉันมีการติดตั้ง WordPress สำหรับบล็อกส่วนตัวและฉันค่อยๆย้ายบิตเว็บเล็ก ๆ ทั้งหมดที่ฉันเขียนในช่วงหลายปีที่ผ่านมาไปยังหน้าต่างๆในบล็อก

หนึ่งหน้าดังกล่าวคือhttp://www.projecttoomanycooks.co.uk/cgi-bin/memory/majorAnalysis.pyซึ่งเป็นสคริปต์ไพ ธ อนธรรมดาที่ส่งคืนรายการคำ - ฉันต้องการฝังลักษณะการทำงานภายในหน้าเวิร์ดเพรส - ใครบางคนชี้ให้ฉันในทิศทางที่ถูกต้องสำหรับวิธีที่ง่ายของการใช้จุดของหลามในเวิร์ดเพรส?

แก้ไข - ทำตามคำตอบที่ยอดเยี่ยมด้านล่างฉันได้รับมากกว่านี้ ... แต่น่าเสียดายที่ยังไม่ค่อยมี ...

ฉันมีงูหลามที่ทำงานบนเซิร์ฟเวอร์ ...

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

และมันอยู่ในไดเรกทอรีเดียวกับปลั๊กอินที่เปิดใช้งาน ...

รหัสหลาม ... ซึ่งมีรหัสต่อไปนี้ ...

#!/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 plugin / template ;-) แต่ในบางกรณีคนใช้ iframe เพื่อฝังหน้าภายนอก
Birgire

iframe โดยตรง :]
Jesse

นี่เป็นเพียงอุบัติเหตุหรือรหัสไพ ธ อนของคุณผสมกับ PHP จริงหรือ
fuxia

ฉันวางเทอร์มินัลเทรซด้วยไฟล์ที่ถูกแสดงโดยคำสั่ง 'มากกว่า' ... จะทำให้เป็นระเบียบขึ้นเล็กน้อย ...
Joe

คำตอบ:


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!")

และนั่นคือทั้งหมดที่ ใช้รหัสย่อและรับเอาท์พุทนี้:

ป้อนคำอธิบายรูปภาพที่นี่


คำตอบที่ถูกต้องไม่ต้องใส่บรรทัดแรกของสคริปต์ไพ ธ อนอย่างน้อยก็ในกรณีของฉันต้องเป็น #! / usr / bin / env python
MikeiLL

1
@MikeiLL ขึ้นอยู่กับระบบของผู้ใช้ดังนั้นฉันก็จงใจทิ้งมันไว้
fuxia

โดยทั่วไปแล้วการทำหลุมรักษาความปลอดภัย หากคุณสามารถไปป์กับไพ ธ อนได้คุณสามารถไพพ์ไปยังกระบวนการอื่นได้เช่นกันและสิ่งนี้สามารถใช้เพื่อเพิ่มการหาประโยชน์เล็กน้อยอื่น
Mark Kaplun

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

เพิ่มการทดสอบเล็กน้อยตามด้านล่างเพื่อดูว่าไฟล์ไพ ธ อนเป็นrwxหรือไม่ ฉันคิดว่าวิธีที่ดีกว่าในการส่งargvจะใช้ fwrite แต่มันก็ไม่ได้ผลสำหรับฉันหลังจากการกวดวิชานี้

นี่คือสคริปต์หลามที่ฉันใช้ ตามที่ระบุไว้ในความคิดเห็นด้านบน#!/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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.