我希望能够从__main__中挑选一个函数或类,其中明显的问题(在其他帖子中提到),pickle函数/类在__main__命名空间中,而在另一个脚本/模块中解开将失败.
我有以下解决方案可行,是否有理由不应该这样做?
以下是myscript.py:
import myscript
import pickle
if __name__ == "__main__":
print pickle.dumps(myscript.myclass())
else:
class myclass:
pass
Run Code Online (Sandbox Code Playgroud)
编辑:unpickling将在一个脚本/模块中完成,该脚本/模块可以访问 myscript.py并且可以执行import myscript.目的是使用类似并行python的解决方案远程调用函数,并能够编写一个包含可远程访问的函数/类的简短独立脚本.
Pickle 似乎着眼于类和函数定义的主要范围。从您要取消pickle的模块内部,尝试以下操作:
import myscript
import __main__
__main__.myclass = myscript.myclass
#unpickle anywhere after this
Run Code Online (Sandbox Code Playgroud)
如果您尝试腌制某些东西以便可以在其他地方使用它,与 分开test_script,这是行不通的,因为 pickle (显然)只是尝试从模块加载该函数。这是一个例子:
测试脚本.py
def my_awesome_function(x, y, z):
return x + y + z
Run Code Online (Sandbox Code Playgroud)
picklescript.py
import pickle
import test_script
with open("awesome.pickle", "wb") as f:
pickle.dump(test_script.my_awesome_function, f)
Run Code Online (Sandbox Code Playgroud)
如果您运行python picklescript.py,然后更改 的文件名test_script,当您尝试加载该函数时,它将失败。例如
运行这个:
import pickle
with open("awesome.pickle", "rb") as f:
pickle.load(f)
Run Code Online (Sandbox Code Playgroud)
将为您提供以下回溯:
Traceback (most recent call last):
File "load_pickle.py", line 3, in <module>
pickle.load(f)
File "/Library/Frameworks/Python.framework/Versions/7.3/lib/python2.7/pickle.py", line 1378, in load
return Unpickler(file).load()
File "/Library/Frameworks/Python.framework/Versions/7.3/lib/python2.7/pickle.py", line 858, in load
dispatch[key](self)
File "/Library/Frameworks/Python.framework/Versions/7.3/lib/python2.7/pickle.py", line 1090, in load_global
klass = self.find_class(module, name)
File "/Library/Frameworks/Python.framework/Versions/7.3/lib/python2.7/pickle.py", line 1124, in find_class
__import__(module)
ImportError: No module named test_script
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2553 次 |
| 最近记录: |