나는 pickle을 compile/exec에 사용하고 싶지만 저에게는 적합하지 않습니다. 전역 네임 스페이스를 사용할 때만 작동합니다. 하지만 글로벌 네임 스페이스를 사용하고 싶지는 않습니다. 감사합니다컴파일/exec에서 pickle이 작동하지 않습니다.
>>> a = compile("def f():\n\t'hello'\nimport pickle\npickle.dumps(f)", "<stdin>", "exec")
>>> exec(a) # works
>>> exec(a, {}) # fails
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 4, in <module>
_pickle.PicklingError: Can't pickle <function f at 0x1050881e0>: it's not the same object as __main__.f
>>> exec(a, {'__name__': '__main__'}) # fails too
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 4, in <module>
_pickle.PicklingError: Can't pickle <function f at 0x1050882f0>: it's not the same object as __main__.f
'dill' 피클 기능이 있어야 작동 할 수 있습니다. – tdelaney
@tdelaney 죄송합니다. 이해가 가지 않습니다. 더 설명해 주시겠습니까? Thanks – zjffdu
'pickle'은 함수의 텍스트 이름은 저장하지만 함수 객체는 저장하지 않습니다. unpickler는 함수를 가져 오기 위해 모듈을 가져와야합니다. 첫 번째 경우에는 함수를 최상위 스크립트의 전역 네임 스페이스에 바인딩했습니다. 그 네임 스페이스는'__main__'이라고 불리 웠으므로'__main__' 모듈을로드하고'f' 함수를 사용하기 만하면됩니다. '__main__'도'f'도 찾을 수 없으므로 작동하지 않습니다. '딜 (dill)'은 기능 자체를 피클하고 당신을 위해 일할 수있는 기회가 더 많습니다. – tdelaney