如何从PHP正确运行Python脚本

时间:2015-02-20 05:57:03

标签: php python linux shell command-line

我有一个python脚本,我想从PHP运行。这是我的PHP脚本:

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

我希望能够在PHP和Python之间交换数据,但上面的错误给出了输出:

  

ERROR NULL

我哪里错了?

::::: EDIT :::::: 我跑了这个:

 $data = array('as', 'df', 'gh');

    // Execute the python script with the JSON data

        $temp = json_encode($data);
        $result= shell_exec('C:\Python27\python.exe test.py ' . "'" . $temp . "'");



    echo $result;

我正在No JSON object could be decoded

2 个答案:

答案 0 :(得分:3)

在我的机器上,代码完全正常并显示:

array(1) {
  'status' =>
  string(4) "Yes!"
}

另一方面,您可以进行一些更改以诊断计算机上的问题。

  1. 检查Python的默认版本。您可以通过从终端运行python来执行此操作。如果您看到类似的内容:

    Python 2.7.6 (default, Mar 22 2014, 22:59:56)
    [GCC 4.8.2] on linux2
    Type "help", "copyright", "credits" or "license" for more information.
    >>>
    
    你很好。如果您发现自己正在运行Python 3,那么这可能是一个问题,因为您的Python脚本是为Python 2编写的。所以:

    Python 3.4.0 (default, Apr 11 2014, 13:05:11)
    [...]
    

    应该是一个线索。

  2. 再次从终端运行python myScript.py "[\"as\",\"df\",\"gh\"]"。你看到了什么?

    {"status": "Yes!"}
    

    很酷。不同的响应表明问题可能在于您的Python脚本。

  3. 检查权限。你如何运行PHP脚本?您有权访问/path/to/吗?那么/path/to/myScript.php呢?

    将您的PHP代码替换为:

    <?php
    echo file_get_contents("/path/to/myScript.php");
    ?>
    

    你得到实际的内容吗?

  4. 现在让我们在PHP代码中添加一些调试助手。由于我认为您没有使用调试器,最简单的方法是打印调试语句。这适用于10-LOC脚本,但如果您需要处理更大的应用程序,请花时间学习如何使用PHP debuggers以及如何使用logging

    结果如下:

    <强> /path/to/demo.php

    <?php
    $data = array('as', 'df', 'gh');
    
    $pythonScript = "/path/to/myScript.py";
    $cmd = array("python", $pythonScript, escapeshellarg(json_encode($data)));
    $cmdText = implode(' ', $cmd);
    
    echo "Running command: " . $cmdText . "\n";
    $result = shell_exec($cmdText);
    
    echo "Got the following result:\n";
    echo $result;
    
    $resultData = json_decode($result, true);
    
    echo "The result was transformed into:\n";
    var_dump($resultData);
    ?>
    

    <强> /path/to/myScript.py

    import sys, json
    
    try:
        data = json.loads(sys.argv[1])
        print json.dumps({'status': 'Yes!'})
    except Exception as e:
        print str(e)
    

    现在运行脚本:

    cd /path/to
    php -f demo.php
    

    这就是我得到的:

    Running command: python /path/to/myScript.py '["as","df","gh"]'
    Got the following result:
    {"status": "Yes!"}
    The result was transformed into:
    array(1) {
      'status' =>
      string(4) "Yes!"
    }
    

    你的应该是不同的,并且包含有关正在发生的事情的提示。

答案 1 :(得分:2)

我通过在参数周围添加引号来实现它! 像这样:    <?php $data = array('as', 'df', 'gh'); $temp = json_encode($data); echo shell_exec('python myScript.py ' . "'" . $temp . "'"); ?>