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)

时间: 2025-01-20 16:59:11

python标准库学习6的相关文章

python标准库学习9

fileinput 模块允许你循环一个或多个文本文件的内容 使用 fileinput 模块循环一个文本文件 import fileinput import sys   for line in fileinput.input("samples/sample.txt"):     sys.stdout.write("-> ")     sys.stdout.write(line)   -> We will perhaps eventually be writ

python标准库学习7

使用 os.path 模块处理文件名 import os   filename = "my/little/pony"   print "using", os.name, "..." print "split", "=>", os.path.split(filename) print "splitext", "=>", os.path.splitext(fi

python标准库学习8

使用sys重定向输出 import sys import string   class Redirect:       def _ _init_ _(self, stdout):         self.stdout = stdout       def write(self, s):         self.stdout.write(string.lower(s))   # redirect standard output (including the print statement) #

python标准库学习5 ---bisect — Array bisection algorithm

#coding=utf-8   import bisect   list=[1,2,3,4,6,7,8,9]   #假定list已经排序 print bisect.bisect_left(list,5)  #返回5应该插入的索引位置   print bisect.bisect_right(list, 5)   print bisect.bisect(list,5)   bisect.insort_left(list, 5, 0, len(list)) print list   bisect.in

python标准库学习4

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 8

Python标准库的学习准备

原文:Python标准库的学习准备 作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢!   Python标准库是Python强大的动力所在,我们已经在前文中有所介绍.由于标准库所涉及的应用很广,所以需要学习一定的背景知识.   硬件原理 这一部份需要了解内存,CPU,磁盘存储以及IO的功能和性能,了解计算机工作的流程,了解指令的概念.这些内容基础而重要. Python标准库的一部份是为了提高系统的性能(比如mmap),所以有必要了

Python标准库——走马观花

原文:Python标准库--走马观花 作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢!   Python的一大好处在于它有一套很有用的标准库(standard library).标准库是随着Python一起安装在你的电脑中的,是Python的一部分 (当然也有特殊情况.有些场合会因为系统安全性的要求,不使用全部的标准库,比如说Google App Engine).   利用已有的类(class)和函数(function)进行开发

Python标准库07 信号 (signal包,部分os包)

原文:Python标准库07 信号 (signal包,部分os包) 作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢!   在了解了Linux的信号基础之后,Python标准库中的signal包就很容易学习和理解.signal包负责在Python程序内部处理信号,典型的操作包括预设信号处理函数,暂停并等待信号,以及定时发出SIGALRM等.要注意,signal包主要是针对UNIX平台(比如Linux, MAC OS),而Windo

Python标准库09 当前进程信息 (部分os包)

原文:Python标准库09 当前进程信息 (部分os包)  作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢!   我们在Linux的概念与体系,多次提及进程的重要性.Python的os包中有查询和修改进程信息的函数.学习Python的这些工具也有助于理解Linux体系.   进程信息 os包中相关函数如下: uname() 返回操作系统相关信息.类似于Linux上的uname命令. umask() 设置该进程创建文件时的权限m