将 Python 列表传递给 php

Posted

技术标签:

【中文标题】将 Python 列表传递给 php【英文标题】:Passing a Python list to 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 中使用字典而不是列表。但是我无法弄清楚到底是怎么回事。

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

【问题讨论】:

【参考方案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!再次感谢!

以上是关于将 Python 列表传递给 php的主要内容,如果未能解决你的问题,请参考以下文章

将 python 列表传递给烧瓶视图不起作用

将 YAML 文件中的列表传递给 python

使用 Python C API 将 Python 整数列表传递给 C 函数

将参数列表传递给Python函数[重复]

将变量和列表传递给 Python 中的函数

Python:当列表仅在运行时确定时,如何将可迭代列表传递给 zip?