为什么我不能从内存中的模块导入

时间:2016-03-30 15:11:19

标签: python python-2.7 module

我可以import module as md

我可以import module.submodule as smd

那为什么我不能做以下任何一种情况?

import module as md
import md.submodule as smd

import module as md
from md import submodule as smd

提出不同的问题:为什么我必须使用长名称,而不是我给它的名字?

在第一行之后,md应该只是内存中的第一类对象。为什么决定不让我从这个对象导入? (特别是考虑到代码"读取"好像module在开始时已经在内存中可用 - Python人明确选择了这种语法,而不是md = import("module")

2 个答案:

答案 0 :(得分:3)

因为md可能是现有模块,并且因为python是允许的,所以它会让你替换它的名字,但你仍然可以随时导入它,例如:

>> import urllib2 as json

虽然json是一个真正的模块并且可以导入,但是如果你想在之后导入它会怎么样呢?

所以当你在这种情况下检查json时

>> json
>> <module 'urllib2' from '/usr/lib/python2.7/urllib2.pyc'>

它指向urllib2,但您仍然可以导入真实json的子模块:

>> from json import tool as tl

json将保持与之前相同的状态,即urllib2。 但你可以把它拿回来

>> import json
>> <module 'json' from '/usr/lib/python2.7/json/__init__.pyc'>

所以为了回答你的问题,它可能是一种让你可以从你所谓的别名中获取模块的方法(如果它是一个真实模块的名称)。

答案 1 :(得分:1)

只需看看模块dis及其documentation所说的内容可能会澄清后台发生的事情。

>>> def g():
...   import numpy as np
... 
>>> def h():
...   import np.ma as ma # note: np is not defined!
... 
>>> dis.dis(g)
  2       0 LOAD_CONST               1 (-1)
          3 LOAD_CONST               0 (None)
          6 IMPORT_NAME              0 (numpy)
          9 STORE_FAST               0 (np)
         12 LOAD_CONST               0 (None)
         15 RETURN_VALUE        
>>> dis.dis(h)
  2       0 LOAD_CONST               1 (-1)
          3 LOAD_CONST               0 (None)
          6 IMPORT_NAME              0 (np.ma)
          9 STORE_FAST               0 (np)
         12 LOAD_CONST               0 (None)
         15 RETURN_VALUE        

引用文档,IMPORT_NAME表示:

  

导入模块co_names [namei]。弹出TOS和TOS1并提供__import__()的fromlist和level参数。模块对象被压入堆栈。当前命名空间不受影响:对于正确的import语句,后续STORE_FAST指令会修改命名空间。

(TOS和TOS1是堆栈顶部和第二个最顶层的堆栈项目。)

因此,我会说它不起作用的原因是import语句当且仅当您传递的令牌实际上是模块名称(不是对象)时才有效,因为这样做传递给__import__函数,该函数需要模块名称,而不是引用/变量/其他。

有关其工作原理的更多信息,请参见__import__文档页面。