Python執行系統命令的方法

 Python中執行系統命令常見方法有兩種:

二者均需 import os php

(1) os.system java

# 僅僅在一個子終端運行系統命令,而不能獲取命令執行後的返回信息 python

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

# 若是再命令行下執行,結果直接打印出來 django

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

(2) os.popen bash

# 該方法不但執行命令還返回執行後的信息對象 ide

popen(command [, mode='r' [, bufsize]]) -> pipe
Open a pipe to/from a command returning a file object. ui

例如: spa

01 >>>tmp = os.popen('ls *.py').readlines()
02 >>>tmp
03 Out[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)

獲取返回和輸出:

1 import subprocess
2 p = subprocess.Popen('ls', shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
3 for line in p.stdout.readlines():
4     print line,
5 retval = 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')

注意: 當執行命令的參數或者返回中包含了中文文字,那麼建議使用subprocess,若是使用os.popen則會出現下面的錯誤:

1 Traceback (most recent call last):
2   File "./test1.py", line 56, in <module>
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)
8 UnicodeEncodeError: 'ascii' codec can't encode characters in position 46-52: ordinal not inrange(128)

關於本文更多的延伸閱讀地址:
http://zh-cn.how-to.mobi/index.php?id=89228

http://www.javaeye.com/topic/406623

相關文章
相關標籤/搜索