举例讲解Linux系统下Python调用系统Shell的方法
|
时候难免需要直接调用Shell命令来完成一些比较简单的操作,比如mount一个文件系统之类的。那么我们使用Python如何调用Linux的Shell命令?下面来介绍几种常用的方法: 1.1. os模块的exec方法族
>>> import os
>>> os.system("echo "Hello World"") # 直接使用os.system调用一个echo命令
Hello World ――――――> 打印命令结果
0 ――――――> What's this ? 返回值?
>>> val = os.system("ls -al | grep "log" ") # 使用val接收返回值
-rw-r--r-- 1 root root 6030829 Dec 31 15:14 log ――――――> 此时只打印了命令结果
>>> print val
0 ――――――> 注意,此时命令正常运行时,返回值是0
>>> val = os.system("ls -al | grep "log1" ")
>>> print val
256 ――――――> 使用os.system调用一个没有返回结果的命令,返回值为256~
>>>
注意:上面说了,此方法脂肪会外部程序的结果,也就是os.system的结果,所以如果你想接收命令的返回值,接着向下看~ 1.3. os模块的popen方法 >>> os.popen('ls -lt') # 调用os.popen(cmd)并不能得到我们想要的结果
<open file 'ls -lt ',mode 'r' at 0xb7585ee8>
>>> print os.popen('ls -lt').read() # 调用read()方法可以得到命令的结果
total 6064
-rwxr-xr-x 1 long long 23 Jan 5 21:00 hello.sh
-rw-r--r-- 1 long long 147 Jan 5 20:26 Makefile
drwxr-xr-x 3 long long 4096 Jan 2 19:37 test
-rw-r--r-- 1 root root 6030829 Dec 31 15:14 log
drwxr-xr-x 2 long long 4096 Dec 28 09:36 pip_build_long
drwx------ 2 Debian-gdm Debian-gdm 4096 Dec 23 19:08 pulse-gylJ5EL24GU9
drwx------ 2 long long 4096 Jan 1 1970 orbit-long
>>> val = os.popen('ls -lt').read() # 使用变量可以接收命令返回值
>>> if "log" in val: # 我们可以使用in来判断返回值中有木有一个字符串
... print "Haha,there is the log"
... else:
... print "No,not happy"
...
Haha,there is the log
2. commands 模块 使用commands模块的getoutput方法,这种方法同popend的区别在于popen返回的是一个类文件对象,而本方法将外部程序的输出结果当作字符串返回,很多情况下用起来要更方便些。 long@zhouyl:/tmp/tests$ python
Python 2.7.3 (default,Jan 2 2013,16:53:07)
[GCC 4.7.2] on linux2
Type "help","copyright","credits" or "license" for more information.
>>> import commands
>>> commands.getstatusoutput('ls -lt') # 返回(status,output)
(0,'total 5900n-rwxr-xr-x 1 long long 23 Jan 5 21:34 hello.shn-rw-r--r-- 1 long long 147 Jan 5 21:34 Makefilen-rw-r--r-- 1 long long 6030829 Jan 5 21:34 log')
>>> commands.getoutput('ls -lt') # 返回命令的输出结果(貌似和Shell命令的输出格式不同哈~)
'total 5900n-rwxr-xr-x 1 long long 23 Jan 5 21:34 hello.shn-rw-r--r-- 1 long long 147 Jan 5 21:34 Makefilen-rw-r--r-- 1 long long 6030829 Jan 5 21:34 log'
>>> commands.getstatus('log') # 调用commands.getoutput中的命令对'log'文件进行相同的操作
'-rw-r--r-- 1 long long 6030829 Jan 5 21:34 log'
>>>
3. subprocess模块 根据Python官方文档说明,subprocess模块用于取代上面这些模块。有一个用Python实现的并行ssh工具―mssh,代码很简短,不过很有意思,它在线程中调用subprocess启动子进程来干活。 subprocess与system相比的优势是它更灵活(你可以得到标准输出,标准错误,“真正”的状态代码,更好的错误处理,等..)。我认为使用os.system已过时,或即将过时。 4. 众方法的比较以及总结 4.2. 关于os.popen 4.4. 关于subprocess.call return_code = subprocess.call("echo Hello World",shell=True)
python和shell读取文件某一行 python和shell(awk命令) 可以实现直接读取文件的某一行,按行号进行读取 。并可以精准的取得该行的某个字段,这个有点类似于x轴、y轴定位某个点的操作。 一、awk取某行某列值 awk 可以设置条件来输出文件中m行到n行中每行的指定的k字段,使用格式如下: awk 'NR==m,NR==n {print $k}' path/filename
m,n,k表示实在的数值。如果要用变量来表示m,n的值,则变量需要用单引号将其引起来。NR,{print }是awk命令在此用法下的规定字段;path/filename表示读取文件的路径及文件名。这里指定了两行,如果只指定一行,可以这样写: awk 'NR==m {print $k}' path/filename
二、python取某行某列 标准库提供的linecache模块提供具体取某一行的方法: import linecache theline = linecache.getline(filepath,line_number) 取到相关的行以后,再对theline做split切分成list,再对list索引取值就行了。如theline.split()[2] 。 三、linecache模块的用法 即然,提到了linecache模块,这里就列下linecache的其他方法。linecache模块允许从任何文件里得到任何的行,并且使用缓存进行优化,常见的情况是从单个文件读取多行。 linecache.getlines(filename) 从名为filename的文件中得到全部内容,输出为列表格式,以文件每行为列表中的一个元素,并以linenum-1为元素在列表中的位置存储 # cat a.txt 1a 2b 3c 4d 5e 6f 7g 1、获取a.txt文件的内容 >>> a=linecache.getlines('a.txt')
>>> a
['1an','2bn','3cn','4dn','5en','6fn','7gn']
2、获取a.txt文件中第1-4行的内容 >>> a=linecache.getlines('a.txt')[0:4]
>>> a
['1an','4dn']
3、获取a.txt文件中第4行的内容 >>> a=linecache.getline('a.txt',4)
>>> a
'4dn'
注意: 使用linecache.getlines('a.txt')打开文件的内容之后,如果a.txt文件发生了改变,如你再次用linecache.getlines获取的内容,不是文件的最新内容,还是之前的内容,此时有两种方法: 1、使用linecache.checkcache(filename)来更新文件在硬盘上的缓存,然后在执行linecache.getlines('a.txt')就可以获取到a.txt的最新内容; 2、直接使用linecache.updatecache('a.txt'),即可获取最新的a.txt的最新内容。 读取文件之后你不需要使用文件的缓存时需要在最后清理一下缓存,使linecache.clearcache()清理缓存,释放缓存。 您可能感兴趣的文章:
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |








