Module

reload 在一次会话中, 模块只在第一次被 import 时运行. 如果想在一次会话中再次运行文件, 使用 reload 函数. 这允许在当前交互会话过程中编辑代码. >>> reload(modulename) reload 希望获得的参数是, 一个已经加载了的模块对象的名称.

import 是语句, reload 是函数.

import

目录下有 __init__.py 时, 可以把目录当作模块 import; __init__.py 中的变量, 可以作为目录模块的属性被访问. 但是, 不能在当前目录, import __init__.py 中的属性.

如, 这是可以的: from django.core.management import execute_manager 在 management 目录这样是不可以的: import execute_manager

__path__

__path__ 作用类似于 sys.path, 用于查找包的模块. 它在 __init__.py 执行以前, 被初始化为包含包的 __init__.py 所在目录的列表. __path__ 可以在 __init__.py 中访问. __path__ 值可以被修改, 这会影响未来搜索包内的模块和子模块. 可以被用来扩展包内的模块, 就是说, 一个模块可以属于一个包, 却不再这个包的(子)目录下.

from

如果一个模块定义有列表 __all__, 则 from module import * 语句只能导入 __all__ 列表中存在的对象.

from module import * 只能用于一个模块的最顶层.

特别注意: 由于存在作用域冲突, 不允许在函数中使用 from 语句.

sys.modules

sys.modules 字典中保存着所有被导入模块的模块名到模块对象的映射, 这个字典用来决定是否需要使用 import 语句来导入一个模块的最新拷贝.

sys.path

导入模块时, 解释器会搜索 sys.path 的列表, 这个列表中保存着一系列目录.

__name__

模块可以通过 __name__ 属性知道自己的全名 >>> from django.contrib import admin >>> admin.__name__ ‘django.contrib.admin’

The Module Search Path

https://docs.python.org/2/tutorial/modules.html#the-module-search-path

When a module named spam is imported, the interpreter first searches for a built-in module with that name. If not found, it then searches for a file named spam.py in a list of directories given by the variable sys.path. sys.path is initialized from these locations:

  • the directory containing the input script (or the current directory).
  • PYTHONPATH (a list of directory names, with the same syntax as the shell variable PATH).
  • the installation-dependent default.