web-dev-qa-db-ja.com

Python script in PHPと2つの間でデータを交換する

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

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

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

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

23
Neta Meta

通常、共通の言語形式を使用し、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);

Python:

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)
60

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

Pythonには、組み込みの XML-RPCサーバーclient があります

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

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

10
dbr

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

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

JSONを使用すると、おそらく標準であり、両方の言語でサポートされているため、両方の言語での生成と解析の両方を簡単に行うことができます(少なくとも、非古代バージョンはサポートしています)。 Pythonでは、

json.dumps(stuff)

そして、PHPで

$stuff = json_decode($pythonoutput);

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

1
Amadan

同じ問題を抱えていて、私のソリューションを共有したいと考えていました。 (アマダンが提案するものに密接に従います)

パイソンピース

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.');
}
1
fchaubard