from ... import 语句
如果你想要直接输入 argv 变量到你的程序中(避免在每次使用它时打sys.),那么你可以使用 from sys import argv 语句。
如果你想要输入所有 sys 模块使用的名字,那么你可以使用 from sys import *语句。
这对于所有模块都适用。
注意:
1.使用 from package import item 方式导入包时,这个子项(item)既可以是包中的一个子模块(或一个子包),也可以是包中定义的其它命名,像函数、类或变量。
import 语句首先核对是否包中有这个子项,如果没有,它假定这是一个模块,并尝试加载它。如果没有找到它,会引发一个 ImportError 异常。
2.使用像 import item.subitem.subsubitem 这样的语句时,这些子项必须是包,最后的子项可以是包或模块,但不能是前面子项中定义的类、函数或变量。
3.应该避免使用 from...import 而使用 import 语句,因为这样可以使你的程序更加易读,也可以避免名称的冲突。
import ... as
为 import 的模块起一个简称。如: import cPickle as p
起简称后,下面的语句即可使用简称,如原本的 cPickle.dump() 可写成 p.dump()
__import__ 用法:
__import__(name[, globals[, locals[, fromlist[, level]]]])
被 import 语句调用的函数。它的存在主要是为了你可以用另外一个有兼容接口的函数 来改变 import 语句的语义.
如果你写过较庞大的 Python 程序, 那么你就应该知道 import 语句是用来导入外部模块的 (当然也可以使用 from-import 版本).
不过你可能不知道 import 其实是靠调用内建 函数 __import__ 来工作的.
通过这个戏法你可以动态地调用函数. 当你只知道模块名称(字符串)的时候, 这将很方便.
1. 使用 __import__ 函数加载模块
# 同目录下建一个 example-plugin.py 文件,里面内容为:
def hello():
print "example-plugin says hello"
# 测试代码
import os
import glob
modules = []
for module_file in glob.glob("*-plugin.py"):
try:
# module_file 是一个包含文件后缀名的文件名,这里分隔出文件名和后缀
module_name, ext = os.path.splitext(os.path.basename(module_file))
module = __import__(module_name)
modules.append(module)
except ImportError:
pass # ignore broken modules
# 调用所有 modules 里面的 hello 函数
for module in modules:
module.hello()
# 注意这个示例里面 plug-in 模块文件名中有个 "-" (hyphens). 这意味着你不能使用普通的 import 命令, 因为 Python 的辨识符不允许有 "-" .
2. 使用 __import__ 函数获得特定函数
def getfunctionbyname(module_name, function_name):
module = __import__(module_name)
return getattr(module, function_name)
op = getfunctionbyname("dumbdbm", "open") # 获取到此函数
print repr(op) # 打印: <function open at 0x01B9B7F0>
# 相当于这样写:
import dumbdbm
op = dumbdbm.open
print repr(op)
3. 使用 __import__ 函数实现 延迟导入
class LazyImport:
def __init__(self, module_name):
self.module_name = module_name
self.module = None
def __getattr__(self, name):
if self.module is None:
self.module = __import__(self.module_name)
return getattr(self.module, name)
s = LazyImport("string")
print s.lowercase # 打印: abcdefghijklmnopqrstuvwxyz
print s.uppercase # 打印: ABCDEFGHIJKLMNOPQRSTUVWXYZ
一个模块要执行其它模块主要有三种方法
第一: import 模块或使用 __import__() 动态导入
第二: 利用 os.system() 执行此模块文件
第三: 利用 execfile 函数
# 同目录下建一个 example-plugin.py 文件,里面内容为:
def hello():
print "example-plugin says hello"
#被导入的模块就不要将执行的代码写在if __name__ == "__main__"下,不然执行不了。
print '加载 example-plugin.py 成功。。。'
#示例1:(使用 动态导入 __import__())
module = __import__('example-plugin') # 打印: 加载 example-plugin.py 成功。。。
module.hello() # 打印: example-plugin says hello
#导入的模块,可以随意定义一个模块名称,然后按正常模块调用
#示例2:(使用 os.system())
import os
module = os.system('python example-plugin.py' % (item.strip())) # 打印: 加载 example-plugin.py 成功。。。
#没法调用模块里面的函数,因为 os.system 是执行系统命令,直接运行了此模块文件而不是导入它
#示例3:(使用 execfile 函数)
execfile('example-plugin.py') # 打印: 加载 example-plugin.py 成功。。。
hello() # 打印: example-plugin says hello
#调用模块里的函数可以直接按本模块的来用,没有新模块名称