带json的Pass生成器(最好在MQTT上)

2024-06-02 10:44:58 发布

您现在位置:Python中文网/ 问答频道 /正文

可以用json协议发送函数或生成器吗

我尝试的是:

import json
import pickle

def gen():
    for i in range(10):
        yield i

pickled=  pickle.dumps(gen)
jsoned = json.dumps(pickled)


enjsoned = json.loads(jsoned)
enpickled = pickle.loads(enjsoned)

>>> for i in enpickled():
        print(i)
0
1
2
3
4
5
6
7
8
9

>>> print(pickled, type(pickled))
('c__main__\ngen\np0\n.', <type 'str'>)
>>> print(jsoned,type(jsoned))
('"c__main__\\ngen\\np0\\n."', <type 'str'>)
>>> print(enjsoned,type(enjsoned))
(u'c__main__\ngen\np0\n.', <type 'unicode'>)

从代码中可以明显看出,我有一个想法,将其pickle,然后通过json发送,并将其保存到其他地方

这在脚本中起作用。但我肯定不能发送它,因为正如你所看到的,编码是字符串。例如,如果我通过MQTT发送它,我将只发送一些字符串形式的引用

你知道有没有可能通过json函数或生成器发送消息

另外,我想指出我不想使用EVAL


Tags: 函数inimportjsonformaintypepickle
1条回答
网友
1楼 · 发布于 2024-06-02 10:44:58

经过一番寻找,我找到了一条可能的路

import dill

def gen():
    for i in range(10):
        yield i

import dill
dilled_gen = dill.dumps(gen)

with open('test.txt','w') as f:
    f.write(dilled_gen )

with open('test.txt','r') as f:
    gen_byted  = f.read()
gen_reloaded = dill.loads(gen_byted)

>>> for  i in gen_reloaded():
        i


0
1
2
3
4
5
6
7
8
9

Dilled生成器以字节为单位:

>>> dilled_gen 
'\x80\x02cdill._dill\n_create_function\nq\x00(cdill._dill\n_load_type\nq\x01U\x08CodeTypeq\x02\x85q\x03Rq\x04(K\x00K\x01K\x02KcU x\x19\x00t\x00\x00d\x01\x00\x83\x01\x00D]\x0b\x00}\x00\x00|\x00\x00V\x01q\r\x00Wd\x00\x00Sq\x05NK\n\x86q\x06U\x05rangeq\x07\x85q\x08U\x01iq\t\x85q\nU5C:\\Users\\marti\\Desktop\\Stackoverflow\\dumpGenerator.pyq\x0bU\x03genq\x0cK\x04U\x04\x00\x01\x13\x01q\r))tq\x0eRq\x0fc__builtin__\n__main__\nh\x0cNN}q\x10tq\x11Rq\x12.'

相关问题 更多 >