Chinaunix首页 | 论坛 | 博客
  • 博客访问: 361563
  • 博文数量: 150
  • 博客积分: 3423
  • 博客等级: 中校
  • 技术积分: 1005
  • 用 户 组: 普通用户
  • 注册时间: 2011-07-15 09:04
文章分类

全部博文(150)

文章存档

2012年(2)

2011年(148)

分类: Python/Ruby

2011-09-11 18:08:55

需要python运行系统命令的目的无非是三种:

  • 处理一项无返回值的数据
  • 得到输出
  • 得到返回值

其实更多的时候我是将返回的结果赋于一变量,便于程序的处理.

那么最好是根据不同的用途,可以合理的调用不同的方法来进行.

总结了这样四种方法,各有利弊,列出与此,仅供参考

1.os.system()

仅仅在一个子终端运行系统命令,而不能获取命令执行后的返回信息

system(command) -> exit_status
Execute the command (a string) in a subshell.

如果再命令行下执行,结果直接打印出来

1>>> os.system('ls')
204101419778.CHM   bash      document    media      py-django   video
311.wmv            books     downloads   Pictures   python
4all-20061022      Desktop   Examples    project    tools

2.os.popen()

该方法不但执行命令还返回执行后的信息对象,这是一个可一个到命令执行结果的操作
popen(command [, mode='r' [, bufsize]]) -> pipe
Open a pipe to/from a command returning a file object.

01>>>tmp = os.popen('ls *.py').readlines()
02>>>tmp
03Out[21]:
04['dump_db_pickle.py ',
05'dump_db_pickle_recs.py ',
06'dump_db_shelve.py ',
07'initdata.py ',
08'__init__.py ',
09'make_db_pickle.py ',
10'make_db_pickle_recs.py ',
11'make_db_shelve.py ',
12'peopleinteract_query.py ',
13'reader.py ',
14'testargv.py ',
15'teststreams.py ',
16'update_db_pickle.py ',
17'writer.py ']

3.使用模块subprocess,同样也可以获得返回与输出

1>>> import subprocess
2>>> subprocess.call (["cmd", "arg1", "arg2"],shell=True)
获取返回和输出:
1import subprocess
2p = subprocess.Popen('ls', shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
3for line in p.stdout.readlines():
4    print line,
5retval = p.wait()

4.使用模块commands模块

1>>> import commands
2>>> dir(commands)
3['__all__', '__builtins__', '__doc__', '__file__', '__name__', 'getoutput', 'getstatus','getstatusoutput', 'mk2arg', 'mkarg']
4>>> commands.getoutput("date")
5'Wed Jun 10 19:39:57 CST 2009'
6>>>
7>>> commands.getstatusoutput("date")
8(0, 'Wed Jun 10 19:40:41 CST 2009')
Python Document 中给的一个例子,很清楚的给出了各方法的返回。
1Traceback (most recent call last):
2  File "./test1.py", line 56, in 
3    main()
4  File "./test1.py", line 45, in main
5    fax.sendFax()
6  File "./mailfax/Fax.py", line 13, in sendFax
7    os.popen(cmd)
8UnicodeEncodeError: 'ascii' codec can't encode characters in position 46-52: ordinal not inrange(128)
阅读(2210) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~