PHP内でPythonスクリプトを実行し、変数を相互に転送することは可能ですか?
特定のグローバルな方法で Web サイトのデータをスクラップするクラスがあります。もっと具体的にしたいのですが、すでにいくつかのWebサイトに固有のpythonsスクリプトがあります。
クラス内にそれらを組み込む方法を探しています。
両者間の安全で信頼できるデータ転送は可能ですか? もしそうなら、そのようなものを手に入れるのはどれくらい難しいですか?
一般に、共通の言語形式を使用し、 と を使用stdin
しstdout
てデータを通信することにより、言語間で通信できます。
シェル引数を使用して 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)
「プロセス間通信」(IPC) を探しています。XML-RPC のようなものを使用できます。これにより、基本的にリモート プロセスで関数を呼び出すことができ、言語間のすべての引数データ型の変換を処理できます (したがって、 Python から PHP 関数を呼び出す、またはその逆 - 引数がサポートされている型である限り)
Python には組み込みのXML-RPC サーバーとクライアントがあります。
phpxmlrpcライブラリにはクライアントとサーバーの両方があります
Python サーバーとクライアント、およびPHP クライアントとサーバーの両方の例があります。
同じ問題があり、私の解決策を共有したかった. (アマダンの提案に厳密に従います)
import subprocess
output = subprocess.check_output(["php", path-to-my-php-script, input1])
名前のない引数を送信するだけでなく、blah = input1 を実行して、$_GET['blah'] を使用することもできます。
$blah = $argv[1];
if( isset($blah)){
// do stuff with $blah
}else{
throw new \Exception('No blah.');
}
最善の策は、python をサブプロセスとして実行し、その出力をキャプチャしてから解析することです。
$pythonoutput = `/usr/bin/env python pythoncode.py`;
JSON は標準であり、両方の言語でサポートされているため (少なくとも、古いバージョン以外ではサポートされているため)、JSON を使用すると、おそらく両方の言語での生成と解析が容易になります。パイソンでは、
json.dumps(stuff)
そしてPHPで
$stuff = json_decode($pythonoutput);
必要な正確なシナリオに応じて、データをファイルとして明示的に保存したり、ソケットを使用したり、これをより効率的に (そしてより複雑に) するさまざまな方法を使用したりすることもできますが、これが最も簡単です。