使用 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