我已经为个人博客安装了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!


,它与已激活的插件在同一目录中。代码...

#!/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;
}


评论

如果这是一个非常简单的脚本,我想我会以PHP作为WordPress插件/模板重写它;-)但在某些情况下,人们会使用iframe嵌入外部页面。

直接iframe吗? :]

这是偶然吗,还是您的python代码真的与PHP混合在一起?

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

#1 楼

您可以使用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脚本,如下所示: prettyprint-override“> print("Hello World!")

仅此而已。使用简码,并获得以下输出:



评论


正确答案忽略了python脚本的第一行,至少就我而言,它必须是#!/ usr / bin / env python

– MikeiLL
2014年5月19日在23:28

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

– fuxia♦
2014年5月20日下午6:33

基本上是一个安全漏洞。如果您可以通过管道传输到python,则也可以通过管道传输到任何其他进程,这可以用于升级更多琐碎的漏洞利用。

–马克·卡普伦
18年8月15日在5:13

@MarkKaplun是的,这不是一个好主意。要做到这一点,必须要进行命令转义,然后进行JavaScript + PHP转义。除非有非常特定的理由,否则这不是在WordPress中开发任何内容的好方法。 “您的科学家-程序员非常关注是否可以,他们没有停下来思考是否应该这样做。”

–布赖恩·斯蒂纳(Brian Stinar)
20年1月20日在22:15

嗨@MarkKaplun,可能是我缺乏对php和wordpress的理解。我确实了解到,只要您可以将任意命令传递给python,那么您就可以以运行python进程的用户身份在主机上提取任意命令。但是在此示例中,仅从管道中进行过读取,因此我看不到如何使用此插件实际写入管道。此外,只有实际上能够修改worpress页面的人员才能利用此安全漏洞,因此对于个人wordpress网站而言,这可能是一个好的解决方案。

– M.D.
20-09-26在11:21

#2 楼

我从第一个答案开始遵循示例脚本,但是没有输出或错误。

我更改了这一行: :

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


,然后收到“权限被拒绝”消息。

在控制台上,我运行了

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


刷新页面,一切正常。

这可能是乔在上面看到的问题。对不起,我没有足够的代表发表评论。希望这对某人有帮助。

评论


不要使权限777。只需使其可执行即可。 chmod + x filename.py将

– Dheeraj M Pai
19年6月25日在5:36

#3 楼

这是一个如上所述的使用proc_open的小脚本,用于将一个简单的文本变量发送给python脚本: python文件是rwx。我认为发送argv的一种更好的方法是使用fwrite,但是按照本教程的要求,它对我不起作用。这是我使用的python脚本。如上面的注释所述,根据服务器的不同,可能需要#!/usr/bin/env python之类的东西。