WordPress内でPythonスクリプトを実行する


19

私は個人的なブログ用にWordPressをインストールしており、長年にわたってブログのページに書いてきた小さなウェブのすべてを徐々に移植しています。

そのようなページの1つは、http: //www.projecttoomanycooks.co.uk/cgi-bin/memory/majorAnalysis.py ですこれは、単語のリストを返す単純なpythonスクリプトです-その動作をワードプレスページに埋め込みたい-誰かがワードプレス内で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を使用して外部ページを埋め込むこともあります。
処女

直接iframeしますか?:]
ジェシー

これは単なる偶然ですか、それともあなたのpythonコードは本当にPHPと混ざっていますか?
FUXIA

私は...少し整理します...「より」コマンドで表示されているファイルで、ターミナルトレースを貼り付ける
ジョー・

回答:


20

Pythonスクリプトのpopen()読み取りまたは書き込みに使用できます(これは他の言語でも機能します)。相互作用(変数を渡す)が必要な場合は、を使用します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

1
@MikeiLLそれはユーザーのシステムに依存するので、意図的に省略しました。
FUXIA

基本的にセキュリティホールを作ります。Pythonにパイプできる場合は、他のプロセスにもパイプできます。これを使用して、ささいな悪用をエスカレートできます。
マーク・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します
テサラクト

2

proc_open上記のように使用して、1つの単純なテキスト変数を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を使用することだと思いますが、このチュートリアルに従ってもうまくいきませんでした。

これが私が使用した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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.