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