喵吉欧尼酱

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
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
    #调用模块里的函数可以直接按本模块的来用,没有新模块名称

 

posted on 2017-08-19 10:28  喵吉欧尼酱  阅读(324)  评论(0)    收藏  举报