在wordpress中运行python脚本


19

我已经为个人博客安装了WordPress,并且逐步将我多年来写的所有小网页内容移植到博客页面上。

这样的页面是http://www.projecttoomanycooks.co.uk/cgi-bin/memory/majorAnalysis.py,这是一个返回单词列表的简单python脚本-我想将该行为嵌入到wordpress页面中-有人可以为我指出正确的方向,以便在wordpress中以简单的方式运行python点吗?

编辑-在下面的精彩回答之后,我的工作还有很多……但不幸的是,那里还远远不够……

我有在服务器上执行的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插件/模板重写它;-)但是在某些情况下,人们使用iframe嵌入外部页面。
birgire 2013年

直接内嵌吗?:]
Jesse

这仅仅是偶然,还是您的python代码确实与PHP混合在一起?
fuxia

我粘贴了终端跟踪,并通过“更多”命令显示了文件...将会整理一些...

Answers:


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 / bin / env python
MikeiLL 2014年

1
@MikeiLL取决于用户的系统,因此我故意将其省略。
fuxia

基本上是一个安全漏洞。如果您可以通过管道传输到python,也可以通过管道传输到任何其他进程,并且可以将其用于升级任何其他琐碎的漏洞利用。
马克·卡普伦'18

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。我认为发送argvfwrite 的更好方法是使用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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.