वर्डप्रेस के भीतर एक अजगर स्क्रिप्ट चल रहा है


19

मेरे पास एक व्यक्तिगत ब्लॉग के लिए एक वर्डप्रेस इंस्टॉल है और मैं धीरे-धीरे उन सभी छोटे वेब बिट्स को पोर्ट कर रहा हूं जो मैंने वर्षों से ब्लॉग पर पृष्ठों पर लिखे हैं।

ऐसा ही एक पृष्ठ है http://www.projecttoomanycooks.co.uk/cgi-bin/memory/majorAnalysis.py जो एक सरल अजगर स्क्रिप्ट है जो शब्दों की एक सूची लौटाता है - मैं उस शब्द पृष्ठ में उस व्यवहार को एम्बेड करना चाहूंगा - क्या कोई मुझे वर्डप्रेस के भीतर अजगर के स्थान को चलाने के आसान तरीके के लिए सही दिशा में इंगित कर सकता है?

EDIT - नीचे दिए गए अद्भुत जवाब के बाद, मुझे बहुत कुछ मिल गया है ... लेकिन दुर्भाग्य से अभी भी काफी नहीं है ...

मेरे पास अजगर है जो सर्वर पर निष्पादित होता है ...

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 में एक वर्डप्रेस प्लगइन / टेम्पलेट के रूप में फिर से लिखूंगा ;-) लेकिन कुछ मामलों में लोग iframes का उपयोग बाहरी पृष्ठों को एम्बेड करने के लिए करते हैं।
बिरगीरे

अगर यह सीधे? :]
जेसी २ '

क्या यह सिर्फ एक दुर्घटना है, या क्या आपका अजगर कोड वास्तव में PHP के साथ मिलाया गया है?
FUXIA

मैंने टर्मिनल ट्रेस पेस्ट किया, 'अधिक' कमांड द्वारा प्रदर्शित की जा रही फाइलों के साथ ... थोड़ा साफ हो जाएगा ...
जो

जवाबों:


20

आप पाइथन स्क्रिप्ट popen()को पढ़ने या लिखने के लिए उपयोग कर सकते हैं (यह किसी अन्य भाषा के साथ भी काम करता है)। यदि आपको इंटरैक्शन (पास चर) का उपयोग करने की आवश्यकता है proc_open()

हैलो वर्ल्ड प्रिंट करने के लिए एक सरल उदाहरण ! एक 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"]

पाइथन स्क्रिप्ट्स को आप उसी डायरेक्टरी में उपयोग करना चाहते हैं जो प्लगइन फाइल के रूप में है। आप उन्हें एक निर्देशिका में भी रख सकते हैं और शोर्ट हैंडलर में पथ समायोजित कर सकते हैं।

अब इस तरह एक जटिल पायथन स्क्रिप्ट बनाएं:

print("Hello World!")

और बस यही। शोर्ट का उपयोग करें, और यह आउटपुट प्राप्त करें:

यहाँ छवि विवरण दर्ज करें


सही उत्तर यह साबित करता है कि पायथन लिपि की पहली पंक्ति, कम से कम मेरे मामले में, # होने की आवश्यकता है! / / Usr / bin / env python
मिकीएलएल

1
@MikeiLL जो उपयोगकर्ता के सिस्टम पर निर्भर करता है, इसलिए मैंने इसे जानबूझकर छोड़ दिया।
FUXIA

मूल रूप से एक सुरक्षा छेद बनाना। यदि आप अजगर को पाइप कर सकते हैं, तो आप किसी अन्य प्रक्रिया में भी पाइप कर सकते हैं और इसका उपयोग किसी भी अधिक तुच्छ कारनामे को बढ़ाने के लिए किया जा सकता है।
मार्क कप्लुन

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ऊपर बताई गई है, एक साधारण पाठ चर को एक पायथन लिपि में भेजने के लिए:

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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.