2017-10-21 15 views
0

配列がPHPファイルから来たときに、Pythonで配列を解析するのが苦労しています。配列をPHPからPythonに送信し、Pythonで解析する

test.phpを

$count = 3; 
    $before_json = array("qwe","wer","ert"); 
    print_r($before_json); 

    $after_json = json_encode($before_json); 
    echo $after_json; 

    $command = escapeshellcmd("test.py $after_json $count"); 
    $output = shell_exec($command); 
    echo $output; 

ますprint_r($ before_json)。配列([0] => qwe [1] => wer [2] => ert)

echo $ after_json;印刷する[ "QWE"、 "WER"、 "ERT"]

py.test

import sys 
    after_json = sys.argv[1] 
    count = sys.argv[2] 
    print (device_id) 

プリント(after_jsonを) - - 表示され

プリント([QWEを、ERT、WER] after_json [1])が印刷されます - q

after_jsonにある3つのアイテムをどのように印刷することができますか?

+3

あなたはPythonでjsonを解析するのを忘れました。 'json'モジュールをインポートすると、' json.loads(after_json) 'を使ってJSON文字列をリストにすることができます。 **更新**:私はこれがコメントではなく答えであるべきだと感じましたが、すでにいくつかのアップフォートがあるのでコメントを残します。 – rickdenhaan

+0

まず最初にPythonプログラムを作成します。文字列を読み込んで文字列の最初の文字を出力するだけです。一時ファイルまたはパイプを使用してプログラム間でデータを送信しようとします。コマンドではありませんライン – MatsLindh

答えて

0

まだPythonでJSON文字列を解析する必要があります。あなたはそのためjsonモジュールを使用することができます。

import sys, json 
after_json = sys.argv[1] 
count = sys.argv[2] 

parsed_data = json.loads(after_json) 
print (parsed_data[0]) # will print "qwe" 
0

rickdenhaanで述べたように、あなたが見ている問題は、PythonでJSONの解析の欠如です。

あなたも、あなたがこの行のシェルインタプリタに送信する場合、正しく文字列を引用することを確認したいしかし:

$command = escapeshellcmd("test.py $after_json $count"); 

我々は、手動での変数に記入した場合、我々は次のような結果が得られますあなたのJSONのフォーマットにスペースが含まれていないので、

$command = escapeshellcmd("test.py [\"qwe\",\"wer\",\"ert\"] 3"); 

これだけ作品:($countが何であるかわからないので、私はちょうど3の値を仮定しました)。解析されたJSONにスペースが入るとすぐに、Pythonスクリプトのシェル呼び出しは完全に失敗します。 JSON配列の各要素は、シェル内で任意のコードが実行される可能性があるため、セキュリティ上の悪夢です。

引数をシェルに渡すときに、その引数をエスケープする必要があります。このためには、関数escapeshellargを使用する必要があります。

これはあなたの代わりに何をしたいか考えられます:

$escaped_json = escapeshellarg($after_json) 
$command = escapeshellcmd("test.py $escaped_json $count"); 

あなたは$countが整数であることを100%わからない場合、あなたはまた、そのパラメータにescapeshellargを呼び出す必要があります。

+0

ありがとう人。私はあなたの変更を加えましたが、私は空白の出力を得ています。 $ countはループのpyスクリプトで使用するカウンタです。テスト。PHPは $ count = 3です。 $ before_json = array( "qwe"、 "wer"、 "ert"); $ after_json = json_encode($ before_json); $ escaped_json = escapeshellarg($ after_json); \t $ command = escapeshellcmd( "python test.py $ escaped_json $ count"); $出力= shell_exec($コマンド); echo $ output; とtest.pyは インポートSYS、JSON escaped_json = sys.argvの[1] カウント= sys.argvの[2] parsed_data = json.loads(escaped_json) プリント(parsed_data [0]) – Gino

+0

ありますまた、parsed_data = json.loads(escaped_json)の行の後に簡単なprint "test"を実行すると、印刷されないことに気づいた – Gino

+0

私がtest.pyでescaped_jsonを印刷すると、この\ [\ "qwe \"、\ "wer \ "、\" ert \ "\] – Gino

関連する問題