- 浏览: 317167 次
文章分类
最新评论
-
ZT71363387:
多谢,帮我解决了抄送人收不到邮件的问题
python smtplib -
dsjt:
pythonw.exe 运行后无反应。版本不匹配啊。
python+PyQT+Eric安装配置 -
dsjt:
xp 32位系统安装eric后,目录下没有 .bat文件是怎么 ...
python+PyQT+Eric安装配置
今天同事叫我编写一个shell脚本。话说,虽然我受*nix的影响甚深,但是对于*nix里随处可见的sh脚本却是讨厌之极。为什么讨厌呢?首先
是因为sh脚本那莫名其妙的语法,感觉就像随写随扔的程序,完全没有任何美感可言。其次是sh脚本的处理能力还是比较弱的,在文本处理、XML处理还有网
络编程方面,基本上都要借助于perl,awk等一堆程序。我对这些程序也是不大喜欢的,况且学习第三方软件总要时间,还不如都用python好了。
那,python可以做shell脚本吗? 首先介绍一个函数:
os.system(command)
这个函数可以调用shell运行命令行command并且返回它的返回值。试一下在python的解释器里输入os.system(”ls
-l”),就可以看到”ls”列出了当前目录下的文件。可以说,通过这个函数,python就拥有了shell的所有能力。呵呵。。不过,通常这条命令不
需要用到。因为shell常用的那些命令在python中通常有对应而且同样简洁的写法。
shell中最常用的是ls命令,python对应的写法是:os.listdir(dirname),这个函数返回字符串列表,里面是所有的文件名,不过不包含”.”和”..”。如果要遍历整个目录的话就会比较复杂一点。我们等下再说吧。先在解释器里试一下:
>>> os.listdir(”/”)
[’tmp’, ‘misc’, ‘opt’, ‘root’, ‘.autorelabel’, ’sbin’, ’srv’,
‘.autofsck’, ‘mnt’, ‘usr’, ‘var’, ‘etc’, ’selinux’, ‘lib’, ‘net’,
‘lost+found’, ’sys’, ‘media’, ‘dev’, ‘proc’, ‘boot’, ‘home’, ‘bin’]
就像这样,接下去所有命令都可以在python的解释器里直接运行观看结果。
对应于cp命令的是:shutil.copy(src,dest),这个函数有两个参数,参数src是指源文件的名字,参数dest则是目标文件或
者目标目录的名字。
如果dest是一个目录名,就会在那个目录下创建一个相同名字的文件。与shutil.copy函数相类似的是
shutil.copy2(src,dest),不过copy2还会复制最后存取时间和最后更新时间。
不过,shell的cp命令还可以复制目录,python的shutil.copy却不行,第一个参数只能是一个文件。这怎么办?其
实,python还有个shutil.copytree(src,dst[,symlinks])
。参数多了一个symlinks,它是一个布尔值,如果是True的话就创建符号链接。
移动或者重命名文件和目录呢?估计被聪明的朋友猜到了,shutil.move(src,dst),呵呵。。与mv命令类似,如果src和dst在
同一个文件系统上,shutil.move只是简单改一下名字,如果src和dst在不同的文件系统上,shutil.move会先把src复制到
dst,然后删除src文件。看到现在,大多数朋友应该已经对python的能力有点眉目了,接下来我就列个表,介绍一下其它的函数:
os.chdir(dirname)
把当前工作目录切换到dirname下
os.getcwd()
返回当前的工作目录路径
os.chroot(dirname)
把dirname作为进程的根目录。和*nix下的chroot命令类似
os.chmod(path,mode)
更改path的权限位。mode可以是以下值(使用or)的组合:
os.S_ISUID
os.S_ISGID
os.S_ENFMT
os.S_ISVTX
os.S_IREAD
os.S_IWRITE
os.S_IEXEC
os.S_IRWXU
os.S_IRUSR
os.S_IWUSR
os.S_IXUSR
os.S_IRWXG
os.S_IRGRP
os.S_IWGRP
os.S_IXGRP
os.S_IRWXO
os.S_IROTH
os.S_IWOTH
os.S_IXOTH
具体它们是什么含义,就不仔细说了,基本上就是R代表读,W代表写,X代表执行权限。USR代表用户,GRP代表组,OTH代表其它。
os.chown(path,uid,gid)
改变文件的属主。uid和gid为-1的时候不改变原来的属主。
os.link(src,dst)
创建硬连接
os.mkdir(path,[mode])
创建目录。mode的意义参见os.chmod(),默认是0777
os.makedirs(path,[mode])
和os.mkdir()类似,不过会先创建不存在的父目录。
os.readlink(path)
返回path这个符号链接所指向的路径
os.remove(path)
删除文件,不能用于删除目录
os.rmdir(path)
删除文件夹,不能用于删除文件
os.symlink(src,dst)
创建符号链接
shutil.rmtree(path[,ignore_errors[,onerror]])
删除文件夹
介绍了这么多,其实只要查一下os和shutil两个模块的文档就有了,呵呵。。真正编写shell脚本的时候还需要注意:
1.环境变量。python的环境变量保存在os.environ这个字典里,可以用普通字典的方法修改它,使用system启动其它程序的时候会自动被继承。比如:
os.environ[”fish”]=”nothing”
不过也要注意,环境变量的值只能是字符串。和shell有些不同的是,python没有export环境变量这个概念。为什么没有呢?因为python没有必要有:-)
2.os.path这个模块里包含了很多关于路径名处理的函数。在shell里路径名处理好像不是很重要,但是在python里经常需要用到。最常用的两个是分离和合并目录名和文件名:
os.path.split(path) -> (dirname,basename)
这个函数会把一个路径分离为两部分,比如:os.path.split(”/foo/bar.dat”)会返回(”/foo”,”bar.dat”)
os.path.join(dirname,basename)
这个函数会把目录名和文件名组合成一个完整的路径名,比如:os.path.join(”/foo”,”bar.dat”)会返回”/foo/bar.dat”。这个函数和os.path.split()刚好相反。
还有这些函数:
os.path.abspath(path)
把path转成绝对路径
os.path.expanduser(path)
把path中包含的”~”和”~user”转换成用户目录
os.path.expandvars(path)
根据环境变量的值替换path中包含的”$name”和”${name}”,比如环境变量FISH=nothing,那os.path.expandvars(”$FISH/abc”)会返回”nothing/abc”
os.path.normpath(path)
去掉path中包含的”.”和”..”
os.path.splitext(path)
把path分离成基本名和扩展名。比如:os.path.splitext(”/foo/bar.tar.bz2″)返回(’/foo/bar.tar’, ‘.bz2′)。要注意它和os.path.split()的区别
3.在os模块有一个很好用的函数叫os.stat()没有介绍,因为os.path模块里包含了一组和它具有同样功能的函数,但是名字更好记一点。
os.path.exists(path)
判断文件或者目录是否存在
os.path.isfile(path)
判断path所指向的是否是一个普通文件,而不是目录
os.path.isdir(path)
判断path所指向的是否是一个目录,而不是普通文件
os.path.islink(path)
判断path所指向的是否是一个符号链接
os.path.ismount(path)
判断path所指向的是否是一个挂接点(mount point)
os.path.getatime(path)
返回path所指向的文件或者目录的最后存取时间。
os.path.getmtime(path)
返回path所指向的文件或者目录的最后修改时间
os.path.getctime(path)
返回path所指向的文件的创建时间
os.path.getsize(path)
返回path所指向的文件的大小
4.应用python编写shell脚本经常要用到os,shutil,glob(正则表达式的文件名),tempfile(临时文
件),pwd(操作/etc/passwd文件),grp(操作/etc/group文件),commands(取得一个命令的输出)。前面两个已经基本
上介绍完了,后面几个很简单,看一下文档就可以了。
5.sys.argv是一个列表,保存了python程序的命令行参数。其中sys.argv[0]是程序本身的名字。
不能光说不练,接下来我们就编写一个用于复制文件的简单脚本。前两天叫我写脚本的同事有个几万个文件的目录,他想复制这些文件到其它的目录,又不能
直接复制目录本身。他试了一下”cp src/* dest/”结果报了一个命令行太长的错误,让我帮他写一个脚本。操起python来:
import sys,os.path,shutil
for f in os.listdir(sys.argv[1]):
shutil.copy(os.path.join(sys.argv[1],f),sys.argv[2])
再试一下linuxapp版里的帖子——把一个文件夹下的所有文件重命名成10001~10999。可以这样写:
import os.path,sys
dirname=sys.argv[1]
i=10001
for f in os.listdir(dirname):
src=os.path.join(dirname,f)
if os.path.isdir(src):
continue
os.rename(src,str(i))
i+=1
返回命令行的返回值:
os.system(cmd)
返回状态值
os.popen(cmd).readlines()
返回命令的值
print ''.join([x for x in os.popen('ls -al').readlines() if x.find("sai")!= -1]),
print ''.join([x for x in os.popen('ls -al').readlines() if re.search("sai",x)]),
本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u3/103355/showart_2077511.html
是因为sh脚本那莫名其妙的语法,感觉就像随写随扔的程序,完全没有任何美感可言。其次是sh脚本的处理能力还是比较弱的,在文本处理、XML处理还有网
络编程方面,基本上都要借助于perl,awk等一堆程序。我对这些程序也是不大喜欢的,况且学习第三方软件总要时间,还不如都用python好了。
那,python可以做shell脚本吗? 首先介绍一个函数:
os.system(command)
这个函数可以调用shell运行命令行command并且返回它的返回值。试一下在python的解释器里输入os.system(”ls
-l”),就可以看到”ls”列出了当前目录下的文件。可以说,通过这个函数,python就拥有了shell的所有能力。呵呵。。不过,通常这条命令不
需要用到。因为shell常用的那些命令在python中通常有对应而且同样简洁的写法。
shell中最常用的是ls命令,python对应的写法是:os.listdir(dirname),这个函数返回字符串列表,里面是所有的文件名,不过不包含”.”和”..”。如果要遍历整个目录的话就会比较复杂一点。我们等下再说吧。先在解释器里试一下:
>>> os.listdir(”/”)
[’tmp’, ‘misc’, ‘opt’, ‘root’, ‘.autorelabel’, ’sbin’, ’srv’,
‘.autofsck’, ‘mnt’, ‘usr’, ‘var’, ‘etc’, ’selinux’, ‘lib’, ‘net’,
‘lost+found’, ’sys’, ‘media’, ‘dev’, ‘proc’, ‘boot’, ‘home’, ‘bin’]
就像这样,接下去所有命令都可以在python的解释器里直接运行观看结果。
对应于cp命令的是:shutil.copy(src,dest),这个函数有两个参数,参数src是指源文件的名字,参数dest则是目标文件或
者目标目录的名字。
如果dest是一个目录名,就会在那个目录下创建一个相同名字的文件。与shutil.copy函数相类似的是
shutil.copy2(src,dest),不过copy2还会复制最后存取时间和最后更新时间。
不过,shell的cp命令还可以复制目录,python的shutil.copy却不行,第一个参数只能是一个文件。这怎么办?其
实,python还有个shutil.copytree(src,dst[,symlinks])
。参数多了一个symlinks,它是一个布尔值,如果是True的话就创建符号链接。
移动或者重命名文件和目录呢?估计被聪明的朋友猜到了,shutil.move(src,dst),呵呵。。与mv命令类似,如果src和dst在
同一个文件系统上,shutil.move只是简单改一下名字,如果src和dst在不同的文件系统上,shutil.move会先把src复制到
dst,然后删除src文件。看到现在,大多数朋友应该已经对python的能力有点眉目了,接下来我就列个表,介绍一下其它的函数:
os.chdir(dirname)
把当前工作目录切换到dirname下
os.getcwd()
返回当前的工作目录路径
os.chroot(dirname)
把dirname作为进程的根目录。和*nix下的chroot命令类似
os.chmod(path,mode)
更改path的权限位。mode可以是以下值(使用or)的组合:
os.S_ISUID
os.S_ISGID
os.S_ENFMT
os.S_ISVTX
os.S_IREAD
os.S_IWRITE
os.S_IEXEC
os.S_IRWXU
os.S_IRUSR
os.S_IWUSR
os.S_IXUSR
os.S_IRWXG
os.S_IRGRP
os.S_IWGRP
os.S_IXGRP
os.S_IRWXO
os.S_IROTH
os.S_IWOTH
os.S_IXOTH
具体它们是什么含义,就不仔细说了,基本上就是R代表读,W代表写,X代表执行权限。USR代表用户,GRP代表组,OTH代表其它。
os.chown(path,uid,gid)
改变文件的属主。uid和gid为-1的时候不改变原来的属主。
os.link(src,dst)
创建硬连接
os.mkdir(path,[mode])
创建目录。mode的意义参见os.chmod(),默认是0777
os.makedirs(path,[mode])
和os.mkdir()类似,不过会先创建不存在的父目录。
os.readlink(path)
返回path这个符号链接所指向的路径
os.remove(path)
删除文件,不能用于删除目录
os.rmdir(path)
删除文件夹,不能用于删除文件
os.symlink(src,dst)
创建符号链接
shutil.rmtree(path[,ignore_errors[,onerror]])
删除文件夹
介绍了这么多,其实只要查一下os和shutil两个模块的文档就有了,呵呵。。真正编写shell脚本的时候还需要注意:
1.环境变量。python的环境变量保存在os.environ这个字典里,可以用普通字典的方法修改它,使用system启动其它程序的时候会自动被继承。比如:
os.environ[”fish”]=”nothing”
不过也要注意,环境变量的值只能是字符串。和shell有些不同的是,python没有export环境变量这个概念。为什么没有呢?因为python没有必要有:-)
2.os.path这个模块里包含了很多关于路径名处理的函数。在shell里路径名处理好像不是很重要,但是在python里经常需要用到。最常用的两个是分离和合并目录名和文件名:
os.path.split(path) -> (dirname,basename)
这个函数会把一个路径分离为两部分,比如:os.path.split(”/foo/bar.dat”)会返回(”/foo”,”bar.dat”)
os.path.join(dirname,basename)
这个函数会把目录名和文件名组合成一个完整的路径名,比如:os.path.join(”/foo”,”bar.dat”)会返回”/foo/bar.dat”。这个函数和os.path.split()刚好相反。
还有这些函数:
os.path.abspath(path)
把path转成绝对路径
os.path.expanduser(path)
把path中包含的”~”和”~user”转换成用户目录
os.path.expandvars(path)
根据环境变量的值替换path中包含的”$name”和”${name}”,比如环境变量FISH=nothing,那os.path.expandvars(”$FISH/abc”)会返回”nothing/abc”
os.path.normpath(path)
去掉path中包含的”.”和”..”
os.path.splitext(path)
把path分离成基本名和扩展名。比如:os.path.splitext(”/foo/bar.tar.bz2″)返回(’/foo/bar.tar’, ‘.bz2′)。要注意它和os.path.split()的区别
3.在os模块有一个很好用的函数叫os.stat()没有介绍,因为os.path模块里包含了一组和它具有同样功能的函数,但是名字更好记一点。
os.path.exists(path)
判断文件或者目录是否存在
os.path.isfile(path)
判断path所指向的是否是一个普通文件,而不是目录
os.path.isdir(path)
判断path所指向的是否是一个目录,而不是普通文件
os.path.islink(path)
判断path所指向的是否是一个符号链接
os.path.ismount(path)
判断path所指向的是否是一个挂接点(mount point)
os.path.getatime(path)
返回path所指向的文件或者目录的最后存取时间。
os.path.getmtime(path)
返回path所指向的文件或者目录的最后修改时间
os.path.getctime(path)
返回path所指向的文件的创建时间
os.path.getsize(path)
返回path所指向的文件的大小
4.应用python编写shell脚本经常要用到os,shutil,glob(正则表达式的文件名),tempfile(临时文
件),pwd(操作/etc/passwd文件),grp(操作/etc/group文件),commands(取得一个命令的输出)。前面两个已经基本
上介绍完了,后面几个很简单,看一下文档就可以了。
5.sys.argv是一个列表,保存了python程序的命令行参数。其中sys.argv[0]是程序本身的名字。
不能光说不练,接下来我们就编写一个用于复制文件的简单脚本。前两天叫我写脚本的同事有个几万个文件的目录,他想复制这些文件到其它的目录,又不能
直接复制目录本身。他试了一下”cp src/* dest/”结果报了一个命令行太长的错误,让我帮他写一个脚本。操起python来:
import sys,os.path,shutil
for f in os.listdir(sys.argv[1]):
shutil.copy(os.path.join(sys.argv[1],f),sys.argv[2])
再试一下linuxapp版里的帖子——把一个文件夹下的所有文件重命名成10001~10999。可以这样写:
import os.path,sys
dirname=sys.argv[1]
i=10001
for f in os.listdir(dirname):
src=os.path.join(dirname,f)
if os.path.isdir(src):
continue
os.rename(src,str(i))
i+=1
返回命令行的返回值:
os.system(cmd)
返回状态值
os.popen(cmd).readlines()
返回命令的值
print ''.join([x for x in os.popen('ls -al').readlines() if x.find("sai")!= -1]),
print ''.join([x for x in os.popen('ls -al').readlines() if re.search("sai",x)]),
本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u3/103355/showart_2077511.html
发表评论
-
lxml.etree
2017-06-21 10:48 618http://www.cnblogs.com/bluesc ... -
Python dictdiffer模块比较两个字典
2017-03-04 17:51 3554http://dictdiffer.readthedocs. ... -
python 判断一个对象是否可迭代
2017-01-23 09:44 651如何判断一个对象是可迭代对象呢?方法是通过collectio ... -
给python交互式命令行增加自动补全和命令历史
2017-01-22 10:09 683在用户目录下新建".pythonstartup& ... -
python 字典格式化
2017-01-16 13:57 408import pprint data = {'a': ... -
python最简洁的条件判断语句写法
2017-01-11 20:11 1168这篇文章主要介绍了Python返回真假值(True or ... -
python 格式化json
2016-12-19 20:07 564#!/usr/bin/env python # -*- ... -
python下载文件的三种方法
2016-11-18 10:21 402Python开发中时长遇到要下载文件的情况,最常用的方法就是 ... -
python 格式化字典字符串
2016-11-13 15:27 346version = {'a': 1, 'b': 2, 'c' ... -
python __fatal退出函数
2016-11-13 14:41 634def __fatal(exitcode, message) ... -
Python logging
2016-09-18 18:13 491#!/usr/bin/env python # -*- ... -
思考:如果list中既包含字符串,又包含整数,由于非字符串类型没有lower()方法,所以列表生成式会报错:
2016-06-24 18:30 2045>>> L = ['Hello', 'Wor ... -
去除重复字符串并保持原来顺序输出
2016-06-23 17:53 1199#!/usr/bin/env python # -*- c ... -
Python getpass 输入密码
2016-03-28 20:35 623Python有个自带的getpass模块: impor ... -
优秀Python学习资源收集汇总(强烈推荐)
2016-02-29 15:15 699Python是一种面向对象、直译式计算机程序设计语言。它的 ... -
python 模拟登录iteye博客
2016-01-07 11:32 638#!/usr/bin/python # -*- codi ... -
Python之路【目录】
2016-01-02 00:41 636http://www.cnblogs.com/wupeiq ... -
Python 正则 提取由start开始到end结束的行
2015-12-16 13:51 695import re s=open(r"bug.t ... -
Python文件替代fileinput模块
2015-12-12 12:05 1386Python文件替代fileinput模块 一,文件替代: ... -
linecache,想读某行周围的哪行都可以
2015-12-12 12:04 710import linecache x=linecache ...
相关推荐
### Python 编写 Shell 脚本:详细解析与实践 #### 一、引言 在日常工作中,Shell 脚本是一种非常实用的工具,它可以帮助我们自动化完成一系列任务,比如文件操作、数据处理等。然而,对于很多开发者而言,Shell ...
掌握Python技能对职业发展有长远益处,因为Python不仅用于脚本编写,还在Web开发、数据分析、机器学习等多个领域有广泛应用。 7. **集成开发环境(IDE)支持** Python有众多优秀的IDE和编辑器,如PyCharm、VSCode等...
该项目是一个使用Python和Shell脚本编写的Siri语音控制Kodi播放的源码设计,共计20个文件,包括5个Python脚本、4个Markdown文档、2个Jupyter Notebook、2个Shell脚本、2个配置文件、1个Git忽略规则、1个JSON文件、1...
在这个压缩包中,我们有四个文件或文件夹,它们涉及到ROS2的脚本应用,包括Shell脚本和Python脚本的实例。 1. **base_land_test**: 这个文件或文件夹可能包含一个测试程序,用于控制机器人的移动,例如让机器人...
标题 "Python-使用Python和Shell编写的持续集成系统" 暗示了这是一个关于利用Python和Shell脚本创建持续集成(Continuous Integration, CI)系统的项目。持续集成是一种软件开发实践,其中开发人员频繁将他们的代码...
本项目是一个开源的多语言项目,主要采用Python编写,并融入了Shell脚本,共计111个文件。其中,Python文件34个,YAML文件30个,numpy数组文件13个,XML文件9个,Shell脚本4个,Python编译文件4个,Word文档4个,CSV...
《高级Bash脚本编程指南》是一本专为那些希望深入了解和掌握Shell脚本艺术的读者精心编写的书籍。在Linux或Unix系统中,Bash(Bourne-Again SHell)是默认的命令行解释器,是编写系统管理脚本、自动化任务以及程序...
该项目是一款利用Python和Shell脚本编写的SSH暴力破解防护工具,包含36个文件,其中Python源码26个,Shell脚本2个,其他类型文件包括文本文件、配置文件和指令文件。该工具通过分析登录日志,自动将尝试通过暴力破解...
该项目为基于12305平台功能的整合设计源码,由172个文件组成,涵盖97个Python字节码文件、49个Python源代码文件、5个PNG图片...项目主要使用Python语言编写,辅以Shell脚本,以实现与12305平台的无缝对接与功能扩展。
将Python集成到Linux Shell脚本中,可以利用`python -c`或`python3 -c`命令执行Python代码片段,或者编写一个Python脚本并用`python script.py`来运行。例如: ```bash #!/bin/bash # 使用Python处理CSV python3 -...
在这个场景中,我们关注的是如何使用Python来实现FTP功能,特别是通过编写脚本来自动化文件上传的过程。`ftp.zip`这个压缩包中包含了一个名为`ftp.py`的Python脚本,它应该是一个实现了FTP文件上传功能的实用工具。 ...
特别是在编写shell脚本时,自动补全能够帮助开发者快速找到并输入正确的函数名、模块名或变量名,从而减少错误和节省时间。本篇文章将详细介绍如何在Ubuntu环境下为Python设置shell脚本中的自动补全功能。 首先,...
在Unix/Linux环境中,Shell脚本允许我们编写一系列命令来执行自动化任务。这个脚本的目的就是读取`prov.csv`中的数据,并将其插入到MySQL数据库中的相应表中。脚本可能包含如下步骤: 1. 使用`cat`或`head`命令查看...
该项目是一个基于Python和Shell脚本编写的Mario流量分析框架设计源码,总计包含43个文件,其中包括11个Python脚本文件、11个Shell脚本文件、5个PNG图像文件、2个服务配置文件、2个规则文件、2个YAML配置文件、1个Git...
Shell脚本和Python脚本在此扮演着重要角色,因为它们能够自动化许多日常运维任务,提高效率并减少人为错误。以下是对这些脚本及其在运维工作中的应用的详细阐述。 首先,让我们关注"shell"标签。Shell脚本是Linux/...
在开始编写Shell脚本之前,你需要掌握一些基本的Linux命令和工具,如ls、cd、mkdir、rm等,这些是进行文件管理和系统操作的基础。接下来,我们会编写第一个Shell脚本,这是一个简单的命令集合,通过执行这些命令,你...
本文介绍了在Python中执行多条Shell命令的几种常见方法,包括使用`subprocess`模块、`os`模块以及编写Shell脚本并调用。每种方法都有其适用场景和局限性,开发者应根据具体需求选择最合适的方法。同时,在处理外部...
使用Python编写,在屏幕上显示一个心型,同时勾画出一朵玫瑰花,可展示给女友看
该方案为基于Python与Shell编写的SVN项目自动化发布与重启脚本,包含38个文件,涵盖16个Shell脚本、6个GZIP压缩文件、3个Python脚本、3个配置文件、2个BZIP2压缩文件、2个ZIP压缩文件、1个授权许可文件、1个INI文件...