29

PHP内でPythonスクリプトを実行し、変数を相互に転送することは可能ですか?

特定のグローバルな方法で Web サイトのデータをスクラップするクラスがあります。もっと具体的にしたいのですが、すでにいくつかのWebサイトに固有のpythonsスクリプトがあります。

クラス内にそれらを組み込む方法を探しています。

両者間の安全で信頼できるデータ転送は可能ですか? もしそうなら、そのようなものを手に入れるのはどれくらい難しいですか?

4

5 に答える 5

71

一般に、共通の言語形式を使用し、 と を使用stdinstdoutてデータを通信することにより、言語間で通信できます。

シェル引数を使用して JSON 経由で初期データを送信する PHP/Python の例

PHP:

// This is the data you want to pass to Python
$data = array('as', 'df', 'gh');

// Execute the python script with the JSON data
$result = shell_exec('python /path/to/myScript.py ' . escapeshellarg(json_encode($data)));

// Decode the result
$resultData = json_decode($result, true);

// This will contain: array('status' => 'Yes!')
var_dump($resultData);

パイソン:

import sys, json

# Load the data that PHP sent us
try:
    data = json.loads(sys.argv[1])
except:
    print "ERROR"
    sys.exit(1)

# Generate some data to send to PHP
result = {'status': 'Yes!'}

# Send it to stdout (to PHP)
print json.dumps(result)
于 2012-12-27T00:41:10.627 に答える
10

「プロセス間通信」(IPC) を探しています。XML-RPC のようなものを使用できます。これにより、基本的にリモート プロセスで関数を呼び出すことができ、言語間のすべての引数データ型の変換を処理できます (したがって、 Python から PHP 関数を呼び出す、またはその逆 - 引数がサポートされている型である限り)

Python には組み込みのXML-RPC サーバークライアントがあります。

phpxmlrpcライブラリにはクライアントとサーバーの両方があります

Python サーバーとクライアント、およびPHP クライアントサーバーの両方の例があります。

于 2012-12-27T01:22:27.837 に答える
2

同じ問題があり、私の解決策を共有したかった. (アマダンの提案に厳密に従います)

パイソンピース

import subprocess

output = subprocess.check_output(["php", path-to-my-php-script, input1])

名前のない引数を送信するだけでなく、blah = input1 を実行して、$_GET['blah'] を使用することもできます。

PHPピース

$blah = $argv[1];



if( isset($blah)){

    // do stuff with $blah

}else{
    throw new \Exception('No blah.');
}
于 2013-08-28T17:08:35.297 に答える
0

最善の策は、python をサブプロセスとして実行し、その出力をキャプチャしてから解析することです。

$pythonoutput = `/usr/bin/env python pythoncode.py`;

JSON は標準であり、両方の言語でサポートされているため (少なくとも、古いバージョン以外ではサポートされているため)、JSON を使用すると、おそらく両方の言語での生成と解析が容易になります。パイソンでは、

json.dumps(stuff)

そしてPHPで

$stuff = json_decode($pythonoutput);

必要な正確なシナリオに応じて、データをファイルとして明示的に保存したり、ソケットを使用したり、これをより効率的に (そしてより複雑に) するさまざまな方法を使用したりすることもできますが、これが最も簡単です。

于 2012-12-27T00:36:10.710 に答える