【问题标题】:Passing a Python list to php将 Python 列表传递给 php
【发布时间】:2013-06-18 14:21:30
【问题描述】:

我对 php 非常陌生,并且我已经花费了相当多的时间来了解如何将参数从 Python 传递给 php,反之亦然。 我现在知道如何传递单个变量,但我仍然卡住,似乎无法找到这个答案:

Php 调用返回字符串列表的 Python 脚本(该部分有效)。我想在 php.ini 中处理这个列表。

当我尝试时:

print mylist

在 myscript.py 中,然后:

$result = exec('python myscript.py')

看起来 php 将 $result 理解为单个字符串(我同意这是有道理的)。

我知道也许 json 可以提供帮助,或者我需要在 python 中使用字典而不是列表。但是我无法弄清楚到底是怎么回事。

如果有人可以提供帮助,将不胜感激!谢谢!

【问题讨论】:

    标签: php python parameter-passing


    【解决方案1】:
    $str = "[u'element1', u'element2', 'element3']";
    
    $str = str_replace( array("u'", "[", "]"), array("'", ""), $str );
    $strToPHPArray = str_getcsv($str, ",", "'");
    print_r( $strToPHPArray );
    

    输出

    Array
    (
        [0] => element1
        [1] => element2
        [2] => element3
    )
    

    【讨论】:

      【解决方案2】:

      显然您的问题具有误导性。被重定向到这里,认为这是将 python 列表转换为 php 数组的解决方案。

      为想要将列表转换为 php 数组的人发布一个简单的解决方案。

      // Sample python list 
      $data = '[["1","2","3","4"],["11","12","13","14"],["21","22","23","24"]]';
      
      // Removing the outer list brackets
      $data =  substr($data,1,-1);
      
      $myArr = array();
      // Will get a 3 dimensional array, one dimension for each list
      $myArr =explode('],', $data);
      
      // Removing last list bracket for the last dimension
      if(count($myArr)>1)
      $myArr[count($myArr)-1] = substr($myArr[count($myArr)-1],0,-1);
      
      // Removing first last bracket for each dimenion and breaking it down further
      foreach ($myArr as $key => $value) {
       $value = substr($value,1);
       $myArr[$key] = array();
       $myArr[$key] = explode(',',$value);
      }
      
      //Output
      Array
      (
      [0] => Array
          (
              [0] => "1"
              [1] => "2"
              [2] => "3"
              [3] => "4"
          )
      
      [1] => Array
          (
              [0] => "11"
              [1] => "12"
              [2] => "13"
              [3] => "14"
          )
      
      [2] => Array
          (
              [0] => "21"
              [1] => "22"
              [2] => "23"
              [3] => "24"
          )
      
      )
      

      【讨论】:

        【解决方案3】:

        您正在使用标准输入/标准输出在程序之间传输数据,这意味着您必须以某种方式对您的结构进行编码,以便让您的接收程序解析元素。

        最简单的方法是让 python 输出类似逗号分隔的列表

        亚当、巴里、该隐

        并使用

        $result = explode(exec('python myscript.py'));
        

        在 php 端将字符串数据转换回数组。

        如果数据不可预测(可能包含逗号)或更结构化(不仅仅是一个简单的列表),那么您应该按照 Krab 的建议选择 json 之类的东西。

        【讨论】:

        • 好吧,这也是有道理的。您是否建议尽可能避免使用 json?它可能与安全性或处理时间有关吗?我只有在这些方面有可怕的想法......
        • 一点也不...如果您要做的不仅仅是一个简单的列表,而且即使您正在做一个简单的列表,您也应该使用 json 或 xml 之类的东西。通常有一些库可以使编码/解码变得相当简单。我更多的是放在简单的列表中来演示通过流(file/stdin/http)在程序之间传递“数组”的原理
        • 知道了!感谢您教育新手 :)
        【解决方案4】:

        例如:

        myscript.py

        import json
        
        D = {'foo':1, 'baz': 2}
        
        print json.dumps(D)
        

        myscript.php

        <?php 
        
        $result = json_decode(exec('python myscript.py'), true);
        echo $result['foo'];
        

        【讨论】:

        • 感谢您的快速回答!我可以看到我做错了什么:当我实际上试图传递一个 numpy 数组时,我以为我正在传递一个列表。作为记录,这不适用于json!再次感谢!
        猜你喜欢
        • 2021-01-09
        • 2015-05-24
        • 1970-01-01
        • 2021-11-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-08-31
        • 2012-09-27
        相关资源
        最近更新 更多