将Python列表传递给PHP

9

我是一名对PHP毫无了解的新手,花费了很多时间学习如何在Python和PHP之间传递参数。

现在我知道如何传递单个变量,但我仍然卡住了,似乎找不到这个问题的答案:

PHP调用一个Python脚本(这部分工作正常),该脚本返回一个字符串列表。我想在PHP中处理这个列表。

当我尝试使用以下代码时:

print mylist

在myscript.py中,然后:

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

看起来php将$result作为一个字符串处理(我同意这样做很有道理)。

我知道也许可以使用json或者在python中使用字典替代列表,但是我无法确切地弄清楚如何操作。

如果有人能帮忙,将不胜感激!谢谢!

4个回答

14
例如:

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中是行不通的!再次感谢! - cenna75

2

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

最简单的方法是让Python输出类似于逗号分隔列表的东西

Adam,Barry,Cain

并使用

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

在PHP端,将您的字符串数据转换回数组。

如果数据是不可预测的(可能包含逗号)或更为结构化(不仅仅是简单列表),那么建议使用Krab所建议的json等类似方法。


1
好的,这也说得通。你是在建议尽可能避免使用JSON吗?这与安全性或处理时间有关吗?我对这些领域只有可怕的概念... - cenna75
1
如果你正在做的不仅仅是一个简单的列表,甚至可能是一个简单的列表,那么你应该使用类似json或xml的东西。通常有可用的库使编码/解码相当简单。我更多地是放入简单的列表来演示通过流(文件/stdin/http)在程序之间传递“数组”的原理。 - Loopo
明白了!感谢您对新手的指导 :) - cenna75

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
)

1
显然您的问题有误导性。被重定向到这里,认为这是将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"
    )

)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接