Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/288.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是否导入对象';s模块?_Python_Pickle - Fatal编程技术网

Python 加载pickle是否导入对象';s模块?

Python 加载pickle是否导入对象';s模块?,python,pickle,Python,Pickle,我的印象是,从pickle加载对象(不是内置类型)将导入模块。例如 指示与要取消勾选的对象类型对应的模块必须存在于同一路径中 但是,当我尝试取消勾选NumPy ndarray时,取消勾选工作正常,但模块似乎没有导入: In [12]: with open('numpysample.pkl', 'rb') as input: ...: a = pickle.load(input) In [14]: type(a) Out[14]: numpy.ndarray In [13]:

我的印象是,从pickle加载对象(不是内置类型)将导入模块。例如 指示与要取消勾选的对象类型对应的模块必须存在于同一路径中

但是,当我尝试取消勾选NumPy ndarray时,取消勾选工作正常,但模块似乎没有导入:

In [12]: with open('numpysample.pkl', 'rb') as input:
    ...:     a = pickle.load(input)

In [14]: type(a)
Out[14]: numpy.ndarray

In [13]: numpy
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-13-8d40275025d1> in <module>
----> 1 numpy

NameError: name 'numpy' is not defined
[12]中的
:以open('numpysample.pkl','rb')作为输入:
…:a=pickle.load(输入)
In[14]:类型(a)
Out[14]:numpy.ndarray
在[13]中:numpy
---------------------------------------------------------------------------
NameError回溯(最近一次呼叫上次)
在里面
---->1努比
NameError:未定义名称“numpy”

这是怎么回事?

Pickle导入模块。只是不要进入那个名字空间<系统模块中的code>'numpy'在调用pickle.load之前为false,之后为true

说不存在要导入numpy的名称空间是正确的吗

pickle.Unpickler.find_class
的源代码应该回答这个问题

    def find_class(self, module, name):
        # Subclasses may override this
        __import__(module)
        mod = sys.modules[module]
        klass = getattr(mod, name)
        return klass

在该方法中,在该函数的作用范围内,
module
中的模块名称绑定到
mod

注意,
import numpy
加载pickle后将非常快地执行;它实际上不再导入
numpy
,它只是从
sys.modules
获取缓存的导入;我试过
sys.modules
,果然如你所说。我理解pickle导入
numpy
,但是说没有导入
numpy
的名称空间是正确的吗?我这样说是因为没有名称绑定到模块(仅在
sys.modules
dict中作为值引用)。由于
\uuuu import\uuuu()
不绑定要加载的模块的名称,并且从外部无法访问
mod
,因此我们无法使用名称直接引用未点击对象的类/模块。但我想我们也可以从
dir()
globals()
中了解到这一点。