Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/drupal/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Pickle能够在.ipynb中序列化代码对象,但在.py中无法实现。为什么会这样?_Python_Python 3.x_Pickle - Fatal编程技术网

Python Pickle能够在.ipynb中序列化代码对象,但在.py中无法实现。为什么会这样?

Python Pickle能够在.ipynb中序列化代码对象,但在.py中无法实现。为什么会这样?,python,python-3.x,pickle,Python,Python 3.x,Pickle,我试图向奇妙的Python编程世界迈出第一步,但一开始就遇到了挫折 我试图在Python上为Python字节码实现一个虚拟机(出于教育目的)。因此,将字节码的生成过程和运行过程分离开来似乎是个好主意。我想先将代码对象序列化到文件中,然后再反序列化并在单独的脚本中运行它 下面是序列化程序的代码的样子: import pickle code_obj = compile("print('Hi!')", "<string>", "exec&

我试图向奇妙的Python编程世界迈出第一步,但一开始就遇到了挫折

我试图在Python上为Python字节码实现一个虚拟机(出于教育目的)。因此,将字节码的生成过程和运行过程分离开来似乎是个好主意。我想先将代码对象序列化到文件中,然后再反序列化并在单独的脚本中运行它

下面是序列化程序的代码的样子:

import pickle

code_obj = compile("print('Hi!')", "<string>", "exec", dont_inherit=True)
ps = pickle.dumps(code_obj)
with open(r"./hi.dump", "wb") as f_dump:
    f_dump.write(ps)
输出:

b'\x80\x04\x95u\x00\x00\x00\x00\x00\x00\x00\x8c\x12ipykernel.codeutil\x94\x8c\tcode_ctor\x94\x93\x94(K\x00K\x00K\x00K\x00K\x02K@C\x0ce\x00d\x00\x83\x01\x01\x00d\x01S\x00\x94\x8c\x03Hi!\x94N\x86\x94\x8c\x05print\x94\x85\x94)\x8c\x08<string>\x94\x8c\x08<module>\x94K\x01C\x00\x94))t\x94R\x94.'
b'\x80\x04\x95u\x00\x00\x00\x00\x00\x00\x8c\x12ipykernel.codeutil\x94\x8c\tcode\x94\x93\x94(K\x00K\x00K\x00K\x00K\x00K\x02K@C\x0ce\x00d\x00\x83\x01\x01\x00d\x01S\x00\x94\x8c\x03Hi!\x94N\x86\x94\x8c\x05print\x94\x85\x94)\x8c\x08\x94\x8c\x08\x94K\x01C\x00\x94)t\x94R\x94
我很容易认为用pickle序列化代码对象是不可能的,但这种行为上的矛盾让我感到困惑

或者也许有一种更好的方法来实现序列化


我很乐意得到一些关于这个问题的建议。

看来答案已经找到了

调查显示,Jupiter笔记本将模块
ipyparallel.serialize.codeutil
附加到其运行时(在某些版本中为
ipykernel.codeutil
)。这个模块所做的唯一一件事就是允许您pickle代码对象


因此,为了使我的初始代码正常工作,我应该将
import-ipyparallel.serialize.codeutil
放在脚本的顶部(
pip-install-ipyparallel
可能也是必需的)。

似乎找到了答案

调查显示,Jupiter笔记本将模块
ipyparallel.serialize.codeutil
附加到其运行时(在某些版本中为
ipykernel.codeutil
)。这个模块所做的唯一一件事就是允许您pickle代码对象


因此,为了使我的初始代码正常工作,我应该将
import-ipyparallel.serialize.codeutil
放在脚本的顶部(
pip-install-ipyparallel
可能也是必需的)。

根据文档(),似乎代码对象是不可pickle的。(参见“什么可以腌制和不腌制”)。我不知道Jupiter添加了什么漏洞,我肯定是在遵循这个思路。我也不知道Jupiter做什么,但它的设计目的是能够对代码对象进行pickle处理。根据文档(),似乎代码对象是不可pickle的。(参见“什么可以腌制和不腌制”)。我不知道Jupiter添加了什么漏洞,我肯定是在遵循这个思路。我也不知道Jupiter做了什么,但它的设计目的是能够pickle代码对象。
import pickle

code_obj = compile("print('Hi!')", "<string>", "exec", dont_inherit=True)
ps = pickle.dumps(code_obj)
with open(r"./hi.dump", "wb") as f_dump:
    f_dump.write(ps)
ps
b'\x80\x04\x95u\x00\x00\x00\x00\x00\x00\x00\x8c\x12ipykernel.codeutil\x94\x8c\tcode_ctor\x94\x93\x94(K\x00K\x00K\x00K\x00K\x02K@C\x0ce\x00d\x00\x83\x01\x01\x00d\x01S\x00\x94\x8c\x03Hi!\x94N\x86\x94\x8c\x05print\x94\x85\x94)\x8c\x08<string>\x94\x8c\x08<module>\x94K\x01C\x00\x94))t\x94R\x94.'