博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
sys.modules和__import__
阅读量:5088 次
发布时间:2019-06-13

本文共 4076 字,大约阅读时间需要 13 分钟。

>>> import sys # 这个时候os这个module已经被加载了,但是在当前作用域并不可见。>>> sys.modules['os']
>>> # 访问os会被提示NameError>>> osTraceback (most recent call last): File "
", line 1, in
NameError: name 'os' is not defined>>> # 将os模块导入到当前作用域>>> import os>>> os
>>> # 从当前作用域删除os>>> del os>>> # 但是os模块还存在sys.modules中>>> sys.modules['os']
>>> # 此时再访问os模块就会报错>>> osTraceback (most recent call last): File "
", line 1, in
NameError: name 'os' is not defined

sys.modules.keys()中的每个模块确实在python启动的时候被导入了,但是它们不像__builtins__那样直接暴露出来了,它们还隐藏着,需要import把它们加入进来。

再比如,module A引用了module B,当import了module A,实际上module B也被间接加载了,但肯定是看不到的。

###########################################################################################################

__import__(name[, globals[, locals[, fromlist[, level]]]])

 

Note 

This is an advanced function that is not needed in everyday Python programming, unlike .

这是一个高级功能,在日常的python编程中并不常用,不像importlib.import_module()。

This function is invoked by the  statement. It can be replaced (by importing the  module and assigning to__builtin__.__import__) in order to change semantics of the  statement, but nowadays it is usually simpler to use import hooks (see ). Direct use of  is rare, except in cases where you want to import a module whose name is only known at runtime.

这个函数被import语句调用。如果改变import语句的语义(通过导入__builtin__并且使用__builtin__.__import__) 则可以可以代替__import__。

直接使用__import__是非常少见的,除了你需要在运行时刻才知道需要导入的模块名。

The function imports the module namepotentially using the given globals and locals to determine how to interpret the name in a package context. The fromlist gives the names of objects or submodules that should be imported from the module given by name. The standard implementation does not use its locals argument at all, and uses its globals only to determine the package context of the  statement.

这个函数导入模块名name,默认情况下使用globals和locals去决定如何在包的上下文中解释模块的name。

fromlist指定了需要在模块name中导入的子模块或者对象。

标准的实现没有使用locals,但是只使用了globals去检测import语句的包的上下文关系。

level specifies whether to use absolute or relative imports. The default is -1 which indicates both absolute and relative imports will be attempted. 0 means only perform absolute imports. Positive values for level indicate the number of parent directories to search relative to the directory of the module calling .

level参数指定了是使用相对导入还是绝对导入。默认的是-1,说明绝对和相对导入都会去尝试。

0的意思是只做绝对导入。

如果level是正整数,则指明了调用__import__的模块需要搜索的父目录的相对路径的数量

When the name variable is of the form package.module, normally, the top-level package (the name up till the first dot) is returned, not the module named by name. However, when a non-empty fromlist argument is given, the module named by name is returned.

当name参数是package.module格式时,顶层的包(第一个点号之前的)会被返回,而不是完整的name名称。

无论如何,当存在fromlist参数时,模块名为name的会被返回。

For example, the statement import spam results in bytecode resembling the following code:

举例,import spam的结果和下面的代码类似:

spam = __import__('spam', globals(), locals(), [], -1)

The statement import spam.ham results in this call:

import spam.ham语句的结果如下:

spam = __import__('spam.ham', globals(), locals(), [], -1)

Note how  returns the toplevel module here because this is the object that is bound to a name by the  statement.

On the other hand, the statement from spam.ham import eggs, sausage as saus results in

从其他方面来说,语句from spam.ham import egges, sausage as saus的结果是:

_temp = __import__('spam.ham', globals(), locals(), ['eggs', 'sausage'], -1)eggs = _temp.eggssaus = _temp.sausage

Here, the spam.ham module is returned from . From this object, the names to import are retrieved and assigned to their respective names.

If you simply want to import a module (potentially within a package) by name, use .

Changed in version 2.5: The level parameter was added.

Changed in version 2.5: Keyword support for parameters was added.

 

举例来说:

 

>>> t = __import__('django.http', fromlist=['Cookie'])>>> t
>>> t.Cookie

 

而这样只返回了顶层的django包:

>>> t = __import__('django.http')>>> t

 

 

转载于:https://www.cnblogs.com/huazi/archive/2012/11/30/2796237.html

你可能感兴趣的文章
centos6.5安装supervisor
查看>>
R语言适配问题集锦
查看>>
map和string的使用方法
查看>>
PowerShell
查看>>
界面使用webview,并且webview里面有图片进行自动切换导致界面上滚动条卡顿。...
查看>>
从大公司做.NET 开发跳槽后来到小公司的做.NET移动端微信开发的个人感慨
查看>>
在Thinkphp中使用AJAX实现无刷新分页
查看>>
磁盘配额(Quota)的应用与实践
查看>>
(转) IOS开发者证书制作
查看>>
使用super调用父类的构造方法
查看>>
中断类型表
查看>>
六度空间(MOOC)
查看>>
Python小世界:项目虚拟环境配置的N种方法
查看>>
Guava Cache 数据变化实现回调的监听器RemovalListener
查看>>
Java类加载器ClassLoader
查看>>
[Leetcode][JAVA] Gas Station
查看>>
Android笔记之Notification使用
查看>>
ueditor 正在读取目录
查看>>
HDU-3790 最短路径问题
查看>>
utime函数
查看>>