• python标准库学习6


    使用 apply 函数

    def function(a, b):
        print a, b
    
    apply(function, ("whither", "canada?"))
    apply(function, (1, 2 + 3))
    

      

    whither canada?
     1 5

    使用 apply 函数传递关键字参数

    def function(a, b):
        print a, b
    
    apply(function, ("crunchy", "frog"))
    apply(function, ("crunchy",), {"b": "frog"})
    apply(function, (), {"a": "crunchy", "b": "frog"})
    
    crunchy frog
    crunchy frog
    crunchy frog
    

      

    使用 apply 函数调用基类的构造函数

    class Rectangle:
        def _ _init_ _(self, color="white", width=10, height=10):
            print "create a", color, self, "sized", width, "x", height
    
    class RoundedRectangle(Rectangle):
        def _ _init_ _(self, **kw):
            apply(Rectangle._ _init_ _, (self,), kw)
    
    rect = Rectangle(color="green", height=100, width=100)
    rect = RoundedRectangle(color="blue", height=20)
    
    create a green <Rectangle instance at 8c8260> sized 100 x 100
    create a blue <RoundedRectangle instance at 8c84c0> sized 10 x 20
    

    使用 _ _import_ _ 函数获得特定函数

    def getfunctionbyname(module_name, function_name):
        module = _ _import_ _(module_name)
        return getattr(module, function_name)
    
    print repr(getfunctionbyname("dumbdbm", "open"))
    
    <function open at 794fa0>
    

      

    使用 _ _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)
    
    string = LazyImport("string")
    
    print string.lowercase
    
    abcdefghijklmnopqrstuvwxyz
    

      

    使用 dir 函数

    def dump(value):
        print value, "=>", dir(value)
    
    import sys
    
    dump(0)
    dump(1.0)
    dump(0.0j) # complex number
    dump([]) # list
    dump({}) # dictionary
    dump("string")
    dump(len) # function
    dump(sys) # module
    
    0 => []
    1.0 => []
    0j => ['conjugate', 'imag', 'real']
    [] => ['append', 'count', 'extend', 'index', 'insert',
        'pop', 'remove', 'reverse', 'sort']
    {} => ['clear', 'copy', 'get', 'has_key', 'items',
        'keys', 'update', 'values']
    string => []
    <built-in function len> => ['_ _doc_ _', '_ _name_ _', '_ _self_ _']
    <module 'sys' (built-in)> => ['_ _doc_ _', '_ _name_ _',
        '_ _stderr_ _', '_ _stdin_ _', '_ _stdout_ _', 'argv',
        'builtin_module_names', 'copyright', 'dllhandle',
        'exc_info', 'exc_type', 'exec_prefix', 'executable',
    ...
    

      

    使用 dir 函数查找类的所有成员

    class A:
        def a(self):
            pass
        def b(self):
            pass
    
    class B(A):
        def c(self):
            pass
        def d(self):
            pass
    
    def getmembers(klass, members=None):
        # get a list of all class members, ordered by class
        if members is None:
            members = []
        for k in klass._ _bases_ _:
            getmembers(k, members)
        for m in dir(klass):
            if m not in members:
                members.append(m)
        return members
    
    print getmembers(A)
    print getmembers(B)
    print getmembers(IOError)
    
    ['_ _doc_ _', '_ _module_ _', 'a', 'b']
    ['_ _doc_ _', '_ _module_ _', 'a', 'b', 'c', 'd']
    ['_ _doc_ _', '_ _getitem_ _', '_ _init_ _', '_ _module_ _', '_ _str_ _']
    

      

    使用 callable 函数

    def dump(function):
        if callable(function):
            print function, "is callable"
        else:
            print function, "is *not* callable"
    
    class A:
        def method(self, value):
            return value
    
    class B(A):
        def _ _call_ _(self, value):
            return value
    
    a = A()
    b = B()
    
    dump(0) # simple objects
    dump("string")
    dump(callable)
    dump(dump) # function
    
    dump(A) # classes
    dump(B)
    dump(B.method)
    
    dump(a) # instances
    dump(b)
    dump(b.method)
    
    0 is *not* callable
    string is *not* callable
    <built-in function callable> is callable
    <function dump at 8ca320> is callable
    A is callable
    B is callable
    <unbound method A.method> is callable
    <A instance at 8caa10> is *not* callable
    <B instance at 8cab00> is callable
    <method A.method of B instance at 8cab00> is callable
    

      

    使用 eval 函数

    def dump(expression):
        result = eval(expression)
        print expression, "=>", result, type(result)
    
    dump("1")
    dump("1.0")
    dump("'string'")
    dump("1.0 + 2.0")
    dump("'*' * 10")
    dump("len('world')")
    
    1 => 1 <type 'int'>
    1.0 => 1.0 <type 'float'>
    'string' => string <type 'string'>
    1.0 + 2.0 => 3.0 <type 'float'>
    '*' * 10 => ********** <type 'string'>
    len('world') => 5 <type 'int'>
    

      

    使用 eval 函数执行任意命令

    print eval("_ _import_ _('os').getcwd()")
    print eval("_ _import_ _('os').remove('file')")
    
    /home/fredrik/librarybook
    Traceback (innermost last):
     File "builtin-eval-example-2", line 2, in ?
     File "<string>", line 0, in ?
    os.error: (2, 'No such file or directory')
    

      

    使用 compile 函数检查语法

    NAME = "script.py"
    
    BODY = """
    prnt 'owl-stretching time'
    """
    
    try:
        compile(BODY, NAME, "exec")
    except SyntaxError, v:
        print "syntax error:", v, "in", NAME
    
    # syntax error: invalid syntax in script.py
    

      

    执行已编译的代码
    

      

    BODY = """
    print 'the ant, an introduction'
    """
    
    code = compile(BODY, "<script>", "exec")
    
    print code
    
    exec code
    
    <code object ? at 8c6be0, file "<script>", line 0>
    the ant, an introduction
    

      Python 还提供了 execfile 函数, 一个从文件加载代码, 编译代码, 执行代码的快捷方式.

    使用 execfile 函数

    execfile("hello.py")
    
    def EXECFILE(filename, locals=None, globals=None):
        exec compile(open(filename).read(), filename, "exec") in locals, globals
    
    EXECFILE("hello.py")
    
    hello again, and welcome to the show
    hello again, and welcome to the show
    

      

    显式地访问 _ _builtin_ _ 模块中的函数

    def open(filename, mode="rb"):
        import _ _builtin_ _
        file = _ _builtin_ _.open(filename, mode)
        if file.read(5) not in("GIF87", "GIF89"):
            raise IOError, "not a GIF file"
        file.seek(0)
        return file
    
    fp = open("samples/sample.gif")
    print len(fp.read()), "bytes"
    
    fp = open("samples/sample.jpg")
    print len(fp.read()), "bytes"
    
    3565 bytes
    Traceback (innermost last):
      File "builtin-open-example-1.py", line 12, in ?
      File "builtin-open-example-1.py", line 5, in open
    IOError: not a GIF file
    

      

    使用 exceptions 模块

    # python imports this module by itself, so the following
    # line isn't really needed
    # python 会自动导入该模块, 所以以下这行是不必要的
    # import exceptions
    
    class HTTPError(Exception):
        # indicates an HTTP protocol error
        def _ _init_ _(self, url, errcode, errmsg):
            self.url = url
            self.errcode = errcode
            self.errmsg = errmsg
        def _ _str_ _(self):
            return (
                "<HTTPError for %s: %s %s>" %
                (self.url, self.errcode, self.errmsg)
                )
    
    try:
        raise HTTPError("http://www.python.org/foo", 200, "Not Found")
    except HTTPError, error:
        print "url", "=>", error.url
        print "errcode", "=>", error.errcode
        print "errmsg", "=>", error.errmsg
        raise # reraise exception
    
    url => http://www.python.org/foo
    errcode => 200
    errmsg => Not Found
    Traceback (innermost last):
      File "exceptions-example-1", line 16, in ?
    HTTPError: <HTTPError for http://www.python.org/foo: 200 Not Found>
    

      

    使用 os 模块重命名和删除文件

    import os
    import string
    
    def replace(file, search_for, replace_with):
        # replace strings in a text file
    
        back = os.path.splitext(file)[0] + ".bak"
        temp = os.path.splitext(file)[0] + ".tmp"
    
        try:
            # remove old temp file, if any
            os.remove(temp)
        except os.error:
            pass
    
        fi = open(file)
        fo = open(temp, "w")
    
        for s in fi.readlines():
            fo.write(string.replace(s, search_for, replace_with))
    
        fi.close()
        fo.close()
    
        try:
            # remove old backup file, if any
            os.remove(back)
        except os.error:
            pass
    
        # rename original to backup...
        os.rename(file, back)
    
        # ...and temporary to original
        os.rename(temp, file)
    
    #
    # try it out!
    
    file = "samples/sample.txt"
    
    replace(file, "hello", "tjena")
    replace(file, "tjena", "hello")
    

      

    使用 os 列出目录下的文件

    import os
    
    for file in os.listdir("samples"):
        print file
    
    sample.au
    sample.jpg
    sample.wav
    ...
    

      getcwd 和 chdir 函数分别用于获得和改变当前工作目录

     使用 os 模块改变当前工作目录

    import os
    
    # where are we?
    cwd = os.getcwd()
    print "1", cwd
    
    # go down
    os.chdir("samples")
    print "2", os.getcwd()
    
    # go back up
    os.chdir(os.pardir)
    print "3", os.getcwd()
    
    1 /ematter/librarybook
    2 /ematter/librarybook/samples
    3 /ematter/librarybook
    

      makedirs 和 removedirs 函数用于创建或删除目录层

    使用 os 模块创建/删除多个目录级

    import os
    
    os.makedirs("test/multiple/levels")
    
    fp = open("test/multiple/levels/file", "w")
    fp.write("inspector praline")
    fp.close()
    
    # remove the file
    os.remove("test/multiple/levels/file")
    
    # and all empty directories above it
    os.removedirs("test/multiple/levels")
    

      removedirs 函数会删除所给路径中最后一个目录下所有的空目录. 而 mkdir 和 rmdir 函数只能处理单个目录级

    使用 os 模块创建/删除目录

    import os
    
    os.mkdir("test")
    os.rmdir("test")
    
    os.rmdir("samples") # this will fail
    
    Traceback (innermost last):
      File "os-example-7", line 6, in ?
    OSError: [Errno 41] Directory not empty: 'samples'
    

      如果需要删除非空目录, 你可以使用 shutil 模块中的 rmtree 函数

    >>> import shutil
    shutil.rmtree("d:\\a")
    

      复制文件目录(包括内部文件)

    >>> shutil.copytree("d:\\new","d:\\a")
    

      复制文件操作:

    shutil.copyfile("d:\\new\\a.txt","d:\\a.txt")
    

      目录或文件的移动操作

    shutil.move("d:\\new\\a.txt","d:\\")
    

      

    使用 os 模块获取文件属性

    import os
    import time
    
    file = "samples/sample.jpg"
    
    def dump(st):
        mode, ino, dev, nlink, uid, gid, size, atime, mtime, ctime = st
        print "- size:", size, "bytes"
        print "- owner:", uid, gid
        print "- created:", time.ctime(ctime)
        print "- last accessed:", time.ctime(atime)
        print "- last modified:", time.ctime(mtime)
        print "- mode:", oct(mode)
        print "- inode/dev:", ino, dev
    
    #
    # get stats for a filename
    
    st = os.stat(file)
    
    print "stat", file
    dump(st)
    print
    
    #
    # get stats for an open file
    
    fp = open(file)
    
    st = os.fstat(fp.fileno())
    
    print "fstat", file
    dump(st)
    
    stat samples/sample.jpg
    - size: 4762 bytes
    - owner: 0 0
    - created: Tue Sep 07 22:45:58 1999
    - last accessed: Sun Sep 19 00:00:00 1999
    - last modified: Sun May 19 01:42:16 1996
    - mode: 0100666
    - inode/dev: 0 2
    
    fstat samples/sample.jpg
    - size: 4762 bytes
    - owner: 0 0
    - created: Tue Sep 07 22:45:58 1999
    - last accessed: Sun Sep 19 00:00:00 1999
    - last modified: Sun May 19 01:42:16 1996
    - mode: 0100666
    - inode/dev: 0 0
    

      可以使用 chmod 和 utime 函数修改文件的权限模式和时间属性

    使用 os 模块修改文件的权限和时间戳

    import os
    import stat, time
    
    infile = "samples/sample.jpg"
    outfile = "out.jpg"
    
    # copy contents
    fi = open(infile, "rb")
    fo = open(outfile, "wb")
    
    while 1:
        s = fi.read(10000)
        if not s:
            break
        fo.write(s)
    
    fi.close()
    fo.close()
    
    # copy mode and timestamp
    st = os.stat(infile)
    os.chmod(outfile, stat.S_IMODE(st[stat.ST_MODE]))
    os.utime(outfile, (st[stat.ST_ATIME], st[stat.ST_MTIME]))
    
    print "original", "=>"
    print "mode", oct(stat.S_IMODE(st[stat.ST_MODE]))
    print "atime", time.ctime(st[stat.ST_ATIME])
    print "mtime", time.ctime(st[stat.ST_MTIME])
    
    print "copy", "=>"
    st = os.stat(outfile)
    print "mode", oct(stat.S_IMODE(st[stat.ST_MODE]))
    print "atime", time.ctime(st[stat.ST_ATIME])
    print "mtime", time.ctime(st[stat.ST_MTIME])
    
    original =>
    mode 0666
    atime Thu Oct 14 15:15:50 1999
    mtime Mon Nov 13 15:42:36 1995
    copy =>
    mode 0666
    atime Thu Oct 14 15:15:50 1999
    mtime Mon Nov 13 15:42:36 1995
    

      system 函数在当前进程下执行一个新命令, 并等待它完成

    使用 os 执行操作系统命令

    import os
    
    if os.name == "nt":
        command = "dir"
    else:
        command = "ls -l"
    
    os.system(command)
    
    -rwxrw-r--   1 effbot  effbot        76 Oct  9 14:17 README
    -rwxrw-r--   1 effbot  effbot      1727 Oct  7 19:00 SimpleAsyncHTTP.py
    -rwxrw-r--   1 effbot  effbot       314 Oct  7 20:29 aifc-example-1.py
    -rwxrw-r--   1 effbot  effbot       259 Oct  7 20:38 anydbm-example-1.py
    ...
    

      命令通过操作系统的标准 shell 执行, 并返回 shell 的退出状态. 需要注意的是在 Windows 下, shell 通常是 command.com , 它的推出状态总是 0.


    exec 函数会使用新进程替换当前进程(或者说是"转到进程").

    使用 os 模块启动新进程

    import os
    import sys
    
    program = "python"
    arguments = ["hello.py"]
    
    print os.execvp(program, (program,) +  tuple(arguments))
    print "goodbye"
    
    hello again, and welcome to the show
    

      execvp 函数, 它会从标准路径搜索执行程序, 把第二个参数(元组)作为单独的参数传递给程序, 并使用当前的环境变量来运行程序. 其他七个同类型函数请参阅 Python Library Reference .

    在 Unix 环境下, 你可以通过组合使用 exec , fork 以及 wait 函数来从当前程序调用另一个程序,fork 函数复制当前进程, wait 函数会等待一个子进程执行结束.

     使用 os 模块调用其他程序 (Unix)

    import os
    import sys
    
    def run(program, *args):
        pid = os.fork()
        if not pid:
            os.execvp(program, (program,) +  args)
        return os.wait()[0]
    
    run("python", "hello.py")
    
    print "goodbye"
    
    hello again, and welcome to the show
    goodbye
    

      

    fork 函数在子进程返回中返回 0 (这个进程首先从 fork 返回值), 在父进程中返回一个非 0 的进程标识符(子进程的 PID ). 也就是说, 只有当我们处于子进程的时候 "not pid" 才为真.

    fork 和 wait 函数在 Windows 上是不可用的, 但是你可以使用 spawn 函数不过, spawn 不会沿着路径搜索可执行文件, 你必须自己处理好这些.

    或许系统当前的“PATH”变量的值

    >>> import string
    >>>import os
    >>> for path in string.split(os.environ["PATH"],os.pathsep):
    	print path
    
    	
    C:\Program Files\NVIDIA Corporation\PhysX\Common
    d:\program files\Python27\Lib\site-packages\PyQt4
    C:\windows\system32
    C:\windows
    C:\windows\System32\Wbem
    C:\windows\System32\WindowsPowerShell\v1.0\
    C:\Program Files\Common Files\Thunder Network\KanKan\Codecs
    D:\Program Files\python
    D:\Program Files\Java\jdk1.6.0_23/bin
    D:\Program Files\Java\jdk1.6.0_23/jre/bin
    C:\Program Files\Microsoft SQL Server\90\Tools\binn\
    D:\vs2010-qt-src-4.7.4\qt-src-4.7.4\bin
    C:\Program Files\Intel\WiFi\bin\
    C:\Program Files\Common Files\Intel\WirelessCommon\
    C:\Program Files\Lenovo\Bluetooth Software\
    D:\vs2010-qt-src-4.7.4\qt-src-4.7.4\bin
    D:\vs2010-qt-src-4.7.4\qt-src-4.7.4\lib
    D:\vs2010-qt-src-4.7.4\qt-src-4.7.4\include
    D:\Qt\4.7.4\bin
    >>> 
    

      

    使用 os 模块调用其他程序 (Windows)

    import os
    import string
    
    def run(program, *args):
        # find executable
        for path in string.split(os.environ["PATH"], os.pathsep):
            file = os.path.join(path, program) + ".exe"
            try:
                return os.spawnv(os.P_WAIT, file, (file,) + args)
            except os.error:
                pass
        raise os.error, "cannot find executable"
    
    run("python", "hello.py")
    
    print "goodbye"
    
    hello again, and welcome to the show
    goodbye
    

      spawn 函数还可用于在后台运行一个程序.下面这个例子给 run 函数添加了一个可选的 mode 参数; 当设置为 os.P_NOWAIT 时, 这个脚本不会等待子程序结束, 默认值 os.P_WAIT 时 spawn 会等待子进程结束.

    其它的标志常量还有 os.P_OVERLAY ,它使得 spawn 的行为和 exec 类似, 以及 os.P_DETACH , 它在后台运行子进程, 与当前控制台和键盘焦点隔离.

    import os
    import string
    
    def run(program, *args, **kw):
        # find executable
        mode = kw.get("mode", os.P_WAIT)
        for path in string.split(os.environ["PATH"], os.pathsep):
            file = os.path.join(path, program) + ".exe"
            try:
                return os.spawnv(mode, file, (file,) + args)
            except os.error:
                pass
        raise os.error, "cannot find executable"
    
    run("python", "hello.py", mode=os.P_NOWAIT)
    print "goodbye"
    
    goodbye
    hello again, and welcome to the show
    

      下面这个例子提供了一个在 Unix 和 Windows 平台上通用的 spawn 方法

    使用 spawn 或 fork/exec 调用其他程序

    import os
    import string
    
    if os.name in ("nt", "dos"):
        exefile = ".exe"
    else:
        exefile = ""
    
    def spawn(program, *args):
        try:
            # possible 2.0 shortcut!
            return os.spawnvp(program, (program,) + args)
        except AttributeError:
            pass
        try:
            spawnv = os.spawnv
        except AttributeError:
    
            # assume it's unix
            pid = os.fork()
            if not pid:
                os.execvp(program, (program,) + args)
            return os.wait()[0]
        else:
            # got spawnv but no spawnp: go look for an executable
            for path in string.split(os.environ["PATH"], os.pathsep):
                file = os.path.join(path, program) + exefile
                try:
                    return spawnv(os.P_WAIT, file, (file,) + args)
                except os.error:
                    pass
            raise IOError, "cannot find executable"
    
    #
    # try it out!
    
    spawn("python", "hello.py")
    
    print "goodbye"
    
    hello again, and welcome to the show
    goodbye
    

      

    处理守护进程

    Unix 系统中, 你可以使用 fork 函数把当前进程转入后台(一个"守护者/daemon"). 一般来说, 你需要派生(fork off)一个当前进程的副本, 然后终止原进程

    使用 os 模块使脚本作为守护执行 (Unix)

    import os
    import time
    
    pid = os.fork()
    if pid:
        os._exit(0) # kill original
    
    print "daemon started"
    time.sleep(10)
    print "daemon terminated"
    

      

    使用 os 模块终止当前进程

    import os
    import sys
    
    try:
        sys.exit(1)
    except SystemExit, value:
        print "caught exit(%s)" % value
    
    try:
        os._exit(2)
    except SystemExit, value:
        print "caught exit(%s)" % value
    
    print "bye!"
    
    caught exit(1)
    

      










  • 相关阅读:
    众多linux 库及工具意思的解释
    ubuntu root 登录
    Oscillator的参数解释
    世界观和方法论写给学弟学妹的
    元件的降额使用可靠度设计
    电子元件又一话——电感篇
    【转】什么是磁珠(Ferrite Bead 即 FB)
    Digital System Design Guidelines
    几种典型接口的电平标准
    珀耳帖效应
  • 原文地址:https://www.cnblogs.com/rollenholt/p/2264597.html
Copyright © 2020-2023  润新知