워드 프레스 내에서 파이썬 스크립트 실행


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 플러그인 / 템플릿으로 다시 작성한다고 생각합니다. ;-) 그러나 경우에 따라 사람들은 iframe을 사용하여 외부 페이지를 포함시킵니다.
birgire

직접 iframe? :]
Jesse

이것은 우연의 일입니까, 아니면 파이썬 코드와 PHP가 실제로 혼합되어 있습니까?
fuxia

'more'명령으로 표시되는 파일과 함께 터미널 추적을 붙여 넣었습니다. 조금 정리합니다 ...
Joe

답변:


20

Python 스크립트 popen()를 읽 거나 쓰는 데 사용할 수 있습니다 (다른 언어에서도 작동). 상호 작용 (변수 전달)이 필요한 경우을 사용하십시오 proc_open().

Hello World 를 인쇄하는 간단한 예 ! 워드 프레스 플러그인에서

플러그인을 작성하고 단축 코드를 등록하십시오.

<?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
이어야 함을 생략합니다.

1
@MikeiLL 사용자의 시스템에 따라 다르므로 의도적으로 생략했습니다.
fuxia

기본적으로 보안 허점을 만듭니다. 파이썬으로 파이프 할 수 있다면 다른 프로세스로 파이프 할 수 있으며 더 이상 사소한 악용을 에스컬레이션하는 데 사용할 수 있습니다.
Mark Kaplun

3

첫 번째 답변에서 예제 스크립트를 따랐지만 출력이나 오류가 발생하지 않았습니다.

나는이 줄을 바꿨다.

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

이에:

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

"권한이 거부되었습니다"라는 메시지가 나타납니다.

콘솔에서 나는 달렸다

chmod 777 hello.py

페이지를 새로 고침하고 모든 것이 완벽하게 작동했습니다.

Joe가 위에서 본 문제 일 수 있습니다. 댓글을 달기에 충분한 담당자가 없습니다. 죄송합니다. 이것이 누군가를 돕기를 바랍니다.


권한 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. 더 좋은 방법은argvfwrite를 사용 은 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.