python 在linux下调用Shell命令
2016-07-06 17:27
891 查看
python中执行shell命令的几个方法,本文一共给出3种方法实现执行shell命令。
其中包括os、subprocess以及commands三个模块下对shell命令的执行,三种方法都可以完成命令,但是subprocess模块是python官方推荐使用的方法,因为subprocess可以更好地支持子进程的使用。
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模块的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 代码:
Popen方法如果需要对输出进行读取,可以使用communicate()方法。
使用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’
其中包括os、subprocess以及commands三个模块下对shell命令的执行,三种方法都可以完成命令,但是subprocess模块是python官方推荐使用的方法,因为subprocess可以更好地支持子进程的使用。
一、os模块
1. os.systemsystem方法会创建子进程运行外部程序,方法只返回外部程序的运行结果,在页面上打印的命令执行结果 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.callsubprocess模块的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’
相关文章推荐
- Linux socket 初步
- android wifi 无线调试
- Linux Kernel 4.0 RC5 发布!
- Python动态类型的学习---引用的理解
- Python3写爬虫(四)多线程实现数据爬取
- 垃圾邮件过滤器 python简单实现
- linux lsof详解
- linux 文件权限
- Linux 执行数学运算
- 下载并遍历 names.txt 文件,输出长度最长的回文人名。
- 10 篇对初学者和专家都有用的 Linux 命令教程
- Linux 与 Windows 对UNICODE 的处理方式
- Ubuntu12.04下QQ完美走起啊!走起啊!有木有啊!
- 解決Linux下Android开发真机调试设备不被识别问题
- 运维入门