您的位置:首页 > 运维架构 > Shell

python 在linux下调用Shell命令

2016-07-06 17:27 891 查看
python中执行shell命令的几个方法,本文一共给出3种方法实现执行shell命令。

其中包括ossubprocess以及commands三个模块下对shell命令的执行,三种方法都可以完成命令,但是subprocess模块是python官方推荐使用的方法,因为subprocess可以更好地支持子进程的使用。

一、os模块

1. os.system

system方法会创建子进程运行外部程序,方法只返回外部程序的运行结果,在页面上打印的命令执行结果 0、1或者其他数字,这些数字代表了命令的正确或者错误原因。

system方法比较适用于外部程序没有输出结果的情况,因为执行的结果会直接打印出来,如果需要打印的结果可以使用os.popen方法。

system方法已经过时,现在官方推荐是使用subprocess模块中的方法,下面也会介绍。

python shell 命令:

>>> import os

>>> os.system (‘ls’)

bin boot dev etc home # 返回ls的结果

0 # 返回的结果0,代表命令正确

2. os.popen

popen方法返回的是一个 file 的对象,可以对其进行读取,通过read()或readlines() 的操作可以看到执行的输出。

popen方法无法读取程序执行的返回值。

python shell 命令:

>>> import os

>>> p = os.popen(‘ls’)

>>> content = p.read()

>>> print content

bin boot dev etc home # 打印ls的结果

>>> p.close()

二、subprocess模块

1. subprocess.call

subprocess模块的call函数。它基本上就像Popen类并都使用相同的参数,但是它只简单的等待命令完成并返回代码。

python shell 命令:

>>> import subprocess

>>> subprocess.call([“ls”, “-l”])

0 # 返回的结果0,代表命令正确

使用了shell=True这个参数。这个时候,使用一整个字符串,而不是一个表来运行子进程。Python将先运行一个shell,再用这个shell来解释这整个字符串。

python shell 命令:

>>> import subprocess

>>> subprocess.call(“ls -l”, shell=True)

0 # 返回的结果0,代表命令正确

2. subprocess.popen

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

python 代码:

import subprocess
child = subprocess.Popen("ping -c 5 www.baidu.com",shell=True)
# 此时会先打印出end, 并不会等待子进程完成
print 'end'


import subprocess
child = subprocess.Popen("ping -c 5 www.baidu.com",shell=True)
child.wait()
# 此时会等待子进程完成,再打印end
print 'end'


Popen方法如果需要对输出进行读取,可以使用communicate()方法。

import subprocess
pipe= subprocess.Popen("ls -l", shell=True, stdout=subprocess.PIPE)
# 使用communicate()来获取指令的输出
content = pipe.communicate()
print content


三、commands模块

1. commands.getoutput

使用getoutput方法,这种方法同popen的区别在于popen返回的是一个类文件对象,而本方法将外部程序的输出结果当作字符串返回,很多情况下用起来要更方便些。

python shell 命令:

>>> import commands

>>> commands.getoutput(‘ls /bin/ls’)

‘/bin/ls’

2. commands.getstatusoutput

使用getstatusoutput方法,返回的结果为(status, output)

python shell 命令:

>>> import commands

>>> commands.getstatusoutput(‘ls /bin/ls’)

(0, ‘/bin/ls’)

3. commands.getstatus

使用getstatus方法,返回ls -ld file的执行结果字符串,调用了getoutput方法,不建议使用此方法

python shell 命令:

>>> import commands

>>> commands.getstatus(‘/bin/ls’)

‘-rwxr-xr-x 1 root 13352 Oct 14 1994 /bin/ls’
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息