/**
* use a python exec call to 'unpickle' the blob_data
* to get the binary blob into a command line argument, base64 encode it
* to get the data back out of python, json serialize it
* @param string $blob binary blob data
* @return mixed
*/
public static function unpickle($blob) {
$cmd = sprintf("import pickle; import base64; import json; print(json.dumps(pickle.loads(base64.b64decode('%s'))))", base64_encode($blob));
$pcmd = sprintf("python -c \"%s\"", $cmd);
$result = exec($pcmd);
$resdec = json_decode($result);
return $resdec;
}
2条答案
按热度按时间jv4diomz1#
blob数据原来是一个pickle tuple(这也是我鄙视python的部分原因--这两种数据类型都只有python才能读取!)Python程序员:标准化的惯例?谁需要标准化公约?!?!')
我想出了一个笨拙的方法来“解嵌”数据,并使用命令行对数据进行json序列化。为了将二进制blob数据放入命令行,我对它进行了base64编码。这是janky但它的作品为我所需要的:
v1uwarro2#
在这个概念上多玩一点,我给自己多了几个选择。首先,我采用了前面答案中的命令行版本,并将其转换为功能更强的Python脚本:
unpickle.py:
此脚本允许您在命令行上将pickle元组'byte'中的blob数据指定为base64编码字符串,或者将原始blob数据通过管道传输到脚本中。如果数据有效且格式正确,这两种变体都将输出json。(如果没有则为空)
如果需要的话,可以使用pyinstaller -F将其转换为自包含的二进制文件,以便在没有python的系统上plop。如果我在使用pyinstaller二进制文件的系统上运行它,或者使用python脚本的系统上运行它,或者只使用python的系统上运行它,我在我的laravel模型中创建了以下静态方法。(我最终会把它移到服务模块中)
示例。env值:
基本上展示了三种不同的方式来调用python来做本质上相同的事情。