복붙노트

[PYTHON] PHP 내부에서 루비 / 파이썬 스크립트를 실행하고 매개 변수를 전달하는 방법은 무엇입니까?

PYTHON

PHP 내부에서 루비 / 파이썬 스크립트를 실행하고 매개 변수를 전달하는 방법은 무엇입니까?

HTML을 동일한 Markdown 구조화 된 텍스트로 변환해야합니다.

OBS : PHP & Python으로 빠르고 쉽게 할 수있는 방법.

PHP로 프로그래밍 할 때 Markdownify가 작업을 수행한다고 표시하는 사용자가 있지만 불행히도 코드가 업데이트되지 않고 실제로 작동하지 않습니다. sourceforge.net/projects/markdownify에는 "참고 : 지원되지 않음 -이 프로젝트를 유지 하시겠습니까?"라는 문구가 있습니다. Markdownify는 PHP로 작성된 HTML에 대한 Markdown 변환기입니다. html2text.php의 후속 판으로 볼 수 있습니다. 더 나은 디자인, 더 나은 성능과 적은 코너 케이스. "

내가 발견 할 수있는 것에서 나는 단 두 가지 좋은 선택만을했습니다.

그래서 PHP에서 HTML 코드를 전달하고 Ruby / Python 스크립트를 호출하여 출력을 받아야합니다.

(그런데, 사람들은 비슷한 질문을 던졌지 만 ( "루비 스크립트를 PHP에서 호출하는 방법"), 그러나 나의 경우에는 실용적인 정보가 없다.)

주석 남자의 팁 (벨로우즈)에 이어, 나는 이것을 얻었다 :

PHP 코드 :

$t='<p><b>Hello</b><i>world!</i></p>';
$scaped=preg_quote($t,"/");
$program='python html2md.py';

//exec($program.' '.$scaped,$n); print_r($n); exit; //Works!!!

$input=$t;

$descriptorspec=array(
   array('pipe','r'),//stdin is a pipe that the child will read from
   array('pipe','w'),//stdout is a pipe that the child will write to
   array('file','./error-output.txt','a')//stderr is a file to write to
);

$process=proc_open($program,$descriptorspec,$pipes);

if(is_resource($process)){
    fwrite($pipes[0],$input);
    fclose($pipes[0]);
    $r=stream_get_contents($pipes[1]);
    fclose($pipes[1]);
    $return_value=proc_close($process);
    echo "command returned $return_value\n";
    print_r($pipes);
    print_r($r);
}

파이썬 코드 :

#! /usr/bin/env python
import html2text
import sys
print html2text.html2text(sys.argv[1])
#print "Hi!" #works!!!

위에 나는 이것을 얻고있다 :

명령이 1을 반환했습니다. 정렬 (     [0] => 자원 ID # 17     1 => 자원 ID # 18 )

그리고 "error-output.txt"파일은 다음과 같이 말합니다 :

추적 (최근 호출 마지막) :   파일 "html2md.py", 5 행     html2text.html2text (sys.argv1) 인쇄 IndexError : 목록 인덱스가 범위를 벗어났습니다.

어떤 아이디어 ???

루비 코드 (아직 분석 중)

#!/usr/bin/env ruby
require_relative 'html2markdown'
puts HTML2Markdown.new("<h1>#{ ARGF.read }</h1>").to_s

레코드 용으로, 나는 PHP의 가장 간단한 "exec ()"를 사용하기 전에 tryed하지만 HTML 언어에 공통적 인 몇 가지 특수 문자를 사용하여 몇 가지 문제가 발생했습니다.

PHP 코드 :

echo exec('./hi.rb');
echo exec('./hi.py');

루비 코드 :

#!/usr/bin/ruby
puts "Hello World!"

파이썬 코드 :

#!usr/bin/python
import sys
print sys.argv[1]

둘 다 잘 작동합니다. 그러나 문자열이 좀 더 복잡 할 때 :

$h='<p><b>Hello</b><i>world!</i></p>';
echo exec("python hi.py $h");

그것은 전혀 작동하지 않았다.

html 문자열에 특수 문자가 필요하기 때문입니다. 나는 이것을 이것을 가지고 얻었다 :

$t='<p><b>Hello</b><i>world!</i></p>';
$scaped=preg_quote($t,"/");

이제 내가 여기서 말한 것처럼 작동합니다.

나는 달린다. 페도라 14 루비 1.8.7 파이썬 2.7 펄 5.12.2 PHP 5.3.4 nginx 0.8.53

해결법

  1. ==============================

    1.PHP가 proc_open을 통해 Ruby 또는 Python 스크립트를 열고 스크립트에서 HTML을 STDIN으로 파이핑하십시오. Ruby / Python 스크립트는 데이터를 읽고 처리 한 다음 STDOUT을 통해 PHP 스크립트로 반환 한 다음 종료합니다. 이것은 Perl, Ruby 또는 Python의 popen-like 기능을 통해 일을하는 일반적인 방법이며 뭔가가 청크를 불거나 임시 파일을 필요로하지 않을 경우를 대비해 STDERR에 액세스 할 수 있기 때문에 유용합니다.하지만 좀 더 복잡합니다.

    PHP가 proc_open을 통해 Ruby 또는 Python 스크립트를 열고 스크립트에서 HTML을 STDIN으로 파이핑하십시오. Ruby / Python 스크립트는 데이터를 읽고 처리 한 다음 STDOUT을 통해 PHP 스크립트로 반환 한 다음 종료합니다. 이것은 Perl, Ruby 또는 Python의 popen-like 기능을 통해 일을하는 일반적인 방법이며 뭔가가 청크를 불거나 임시 파일을 필요로하지 않을 경우를 대비해 STDERR에 액세스 할 수 있기 때문에 유용합니다.하지만 좀 더 복잡합니다.

    다른 방법으로는 PHP에서 임시 파일로 데이터를 작성한 다음 시스템, exec 또는 비슷한 것을 사용하여 Ruby / Python 스크립트를 호출하여 열고 열고 처리하고 STDOUT을 사용하여 출력을 인쇄 할 수 있습니다.

    편집하다:

    @ Jonke의 "Ruby에서의 STDIN 모범 사례"에 대한 답변을 참조하십시오. 루비를 사용하여 STDIN을 읽고 STDOUT에 쓰는 것이 얼마나 간단한 지에 대한 예제가 있습니다. "어떻게 파이썬에서 stdin을 읽습니까?"라는 언어에 대한 좋은 샘플이 있습니다.

    이것은 간단한 예제로 Ruby 스크립트를 호출하고 PHP의 STDIN 파이프를 통해 문자열을 전달하고 Ruby 스크립트의 STDOUT을 읽는 방법을 보여줍니다.

    이것을 "test.php"로 저장하십시오 :

    <?php
    $descriptorspec = array(
       0 => array("pipe", "r"),  // stdin is a pipe that the child will read from
       1 => array("pipe", "w"),  // stdout is a pipe that the child will write to
       2 => array("file", "./error-output.txt", "a") // stderr is a file to write to
    );
    $process = proc_open('ruby ./test.rb', $descriptorspec, $pipes);
    
    if (is_resource($process)) {
        // $pipes now looks like this:
        // 0 => writeable handle connected to child stdin
        // 1 => readable handle connected to child stdout
        // Any error output will be appended to /tmp/error-output.txt
    
        fwrite($pipes[0], 'hello world');
        fclose($pipes[0]);
    
        echo stream_get_contents($pipes[1]);
        fclose($pipes[1]);
    
        // It is important that you close any pipes before calling
        // proc_close in order to avoid a deadlock
        $return_value = proc_close($process);
    
        echo "command returned $return_value\n";
    }
    ?>
    

    이것을 "test.rb"로 저장하십시오 :

    #!/usr/bin/env ruby
    
    puts "<b>#{ ARGF.read }</b>"
    

    PHP 스크립트를 실행하면 다음을 수행 할 수 있습니다.

    Greg:Desktop greg$ php test.php 
    <b>hello world</b>
    command returned 0
    

    PHP 스크립트가 Ruby 인터프리터를 열고 Ruby 스크립트를 엽니 다. 그런 다음 PHP는 "hello world"를 보냅니다. Ruby는받은 텍스트를 굵은 태그로 묶어서 출력하고 PHP에서 캡쳐 한 다음 출력합니다. 임시 파일이 없으며 명령 행에서 전달 된 것도 없습니다. 필요하다면 많은 데이터를 전달할 수 있으며 매우 빠릅니다. Ruby 대신 Python이나 Perl을 쉽게 사용할 수 있습니다.

    편집하다:

    당신이 가지고 있다면:

    HTML2Markdown.new('<h1>HTMLcode</h1>').to_s
    

    샘플 코드로 다음과 같이 Ruby 솔루션을 개발할 수 있습니다.

    #!/usr/bin/env ruby
    
    require_relative 'html2markdown'
    
    puts HTML2Markdown.new("<h1>#{ ARGF.read }</h1>").to_s
    

    이미 HTML2Markdown 코드를 다운로드하여 현재 디렉토리에두고 Ruby 1.9.2를 실행 중이라고 가정합니다.

  2. ==============================

    2.파이썬에서 PHP가 var를 명령 줄 인수로 전달하고 sys.argv (파이썬에 전달 된 명령 줄 인수 목록)에서 가져온 다음 Python에서 출력을 인쇄하도록 설정 한 다음 PHP가 반향하게합니다. 예:

    파이썬에서 PHP가 var를 명령 줄 인수로 전달하고 sys.argv (파이썬에 전달 된 명령 줄 인수 목록)에서 가져온 다음 Python에서 출력을 인쇄하도록 설정 한 다음 PHP가 반향하게합니다. 예:

    #!usr/bin/python
    import sys
    
    print "Hello ", sys.argv[1] # 2nd element, since the first is the script name
    

    PHP :

    <?php
    echo exec('python script.py Rafe');
    ?>
    

    절차는 Ruby에서 기본적으로 동일해야합니다.

  3. ==============================

    3.Ruby 코드에서 변수를 사용하고이를 PHP 코드에서 Ruby 스크립트의 인수로 전달하십시오. 그런 다음 Ruby 스크립트가 처리 된 코드를 PHP가 읽을 수있는 stdout으로 반환하도록합니다.

    Ruby 코드에서 변수를 사용하고이를 PHP 코드에서 Ruby 스크립트의 인수로 전달하십시오. 그런 다음 Ruby 스크립트가 처리 된 코드를 PHP가 읽을 수있는 stdout으로 반환하도록합니다.

  4. ==============================

    4.나는 당신의 질문이 잘못되었다고 생각합니다. 귀하의 문제는 HTML에서 Markdown으로 변환하는 방법입니다. 내가 맞습니까?

    나는 당신의 질문이 잘못되었다고 생각합니다. 귀하의 문제는 HTML에서 Markdown으로 변환하는 방법입니다. 내가 맞습니까?

    이것을 시도해보십시오 http://milianw.de/projects/markdownify/ 제가 도움이 될 것 같아요 =)

  5. ==============================

    5.또 다른 아주 이상한 접근법은 내가 사용한 것과 비슷할 것이다.

    또 다른 아주 이상한 접근법은 내가 사용한 것과 비슷할 것이다.

    Php file -> output.txt
    ruby file -> read from output.txt
    Ruby file-> result.txt
    Php file -> read from result.txt
    
    simple add exec(rubyfile.rb);
    

    권장하지는 않지만 확실히 작동합니다.

  6. from https://stackoverflow.com/questions/4619996/how-to-run-ruby-python-scripts-from-inside-php-passing-and-receiving-parameters by cc-by-sa and MIT license