python常用指令-日常整理python执行系统命令的常见方法(全)

具体内容如下:

1 os.system

例如 ipython中运行如下命令,返回运行状态status

os.system('cat /etc/passwdqc.conf')

min=disabled,24,11,8,7

max=40

passphrase=3

match=4

similar=deny

random=47

enforce=everyone

retry=3

Out[6]: 0

2 os.popen()

popen(command [, mode='r' [, bufsize]]) -> pipe

Open a pipe to/from a command returning a file object.

运行返回结果

In [20]: output = os.popen('cat /proc/cpuinfo')

In [21]: lineLen = []

In [22]: for line in output.readlines():

lineLen.append(len(line))

....:

In [23]: line

line lineLen

In [23]: lineLen

Out[23]:

[14,

25,

...

3 如何同时返回结果和运行状态,commands模块:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

#String form:

File:/usr/lib64/python2.7/commands.py

Docstring:

Execute shell commands via os.popen()and return status, output.

Interface summary:

import commands

outtext= commands.getoutput(cmd)

(exitstatus, outtext)= commands.getstatusoutput(cmd)

outtext= commands.getstatus(file)# returns output of "ls -ld file"

A trailing newlineis removedfrom the output string.

Encapsulates the basic operation:

pipe= os.popen('{ ' + cmd+ '; } 2>&1','r')

text= pipe.read()

sts= pipe.close()

commands示例如下:

In [24]: (status, output) = commands.getstatusoutput('cat /proc/cpuinfo')

In [25]: status

Out[25]: 0

In [26]: len(output)

Out[26]: 3859

4 使用模块subprocess

ipython 中运行"?subprocess"可以发现subprocess是python用来替换os.popen()等管道操作命令的新模块

A more real-world example would look like this:

?

1

2

3

4

5

6

7

8

try:

retcode= call("mycmd" + " myarg", shell=True)

if retcode <0:

print >>sys.stderr,"Child was terminated by signal",-retcode

else:

print >>sys.stderr,"Child returned", retcode

except OSError, e:

print >>sys.stderr,"Execution failed:", e

相对于上面几种方式,subprocess便于控制和监控进程运行结果,subprocess提供多种函数便于应对父进程对子进程不同要求:

4.1.1 subprocess.call()

父进程父进程等待子进程完成,返回exit code

4.1.2 subprocess.check_call()

父进程等待子进程完成,返回0,如果returncode不为0,则举出错误subprocess.CalledProcessError,该对象包含有returncode属性,可用try...except...来检查

4.1.3 subprocess.check_output()

父进程等待子进程完成

返回子进程向标准输出的输出结果

检查退出信息,如果returncode不为0,则举出错误subprocess.CalledProcessError,该对象包含有returncode属性和output属性,output属性为标准输出的输出结果,可用try...except...来检查

例如:

In [32]: out = subprocess.call("ls -l", shell=True)

total 42244

-rw-rw-r--. 1 *** *** 366 May 26 09:10 ChangeLog

4.2.1

上面三个函数都是源于Popen()函数的wapper(封装),如果需要更加个性化应用,那么就需要使用popen()函数

Popen对象创建后,主程序不会自动等待子进程完成。我们必须调用对象的wait()方法,父进程才会等待 (也就是阻塞block)

?

1

2

3

4

5

6

7

8

[wenwt@localhost syntax]$ rm subprocess.pyc

[wenwt@localhost syntax]$ python process.py

parent process

[wenwt@localhost syntax]$ PING www.google.com (173.194.219.99)56(84) bytes of data.

^C

[wenwt@localhost syntax]$

--- www.google.com ping statistics---

5 packets transmitted,0 received,100% packet loss, time3999ms

加上wait方法:

?

1

2

3

4

5

[wenwt@localhost syntax]$ python process.py

PING www.google.com (173.194.219.103)56(84) bytes of data.

--- www.google.com ping statistics---

5 packets transmitted,0 received,100% packet loss, time3999ms

parent process

补充介绍:Python 执行终端命令的方法

?

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

import os

import subprocess

'''

os.system模块

os.system("ls -hl") 执行命令并返回状态码,当返回0表示成功;返回256表示失败,痛点是无法返回output

os.popen模块

os.popen("ls -hl") 执行命令,之后通过.read()方法获取output返回值

subprocess模块

subprocess.getstatusoutput("ls -hl") 执行命令,并返回状态status、输出output

subprocess.getoutput("ls -hl") 执行命令,只返回输出结果output

subprocess.call("ls -hl") 执行命令并返回状态码 和os.system("ls -hl")类似

'''

def test_system(cmd):

status= os.system(cmd)# 会自动输出output到控制台 但是无法接收,status为0表示成功、status为256表示失败

print(status)

def test_popen(cmd):

output= os.popen(cmd).read()# 只会获取到命令的output,如果是有output的错误命令 会输出output,否则输出空白

print(output)

def test_getoutput(cmd):

output= subprocess.getoutput(cmd)# 和os.popen(cmd)类似

print(output)

def test_getstatusoutput(cmd):

status, output= subprocess.getstatusoutput(cmd)# 执行命令,并返回状态status、输出output

print(status)

print(output)

def test_call(cmd):

status= subprocess.call(cmd)# 和os.system(cmd)类似

print(status)

if __name__== '__main__':

# test_system('ls -lh') # test_system('test')

# test_popen('pwd') # test_popen('test')

# test_getoutput('pwd')

# test_getstatusoutput('pwd')

test_call('pwd')

以上内容就是本文的全部叙述,希望大家喜欢。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值