千家信息网

python编写shell脚本的方法

发表于:2025-11-09 作者:千家信息网编辑
千家信息网最后更新 2025年11月09日,这篇文章给大家介绍python编写shell脚本的方法,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。首先介绍一个函数:os.system(command)这个函数
千家信息网最后更新 2025年11月09日python编写shell脚本的方法

这篇文章给大家介绍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所指向的是否是一个普通文件,而不是目录

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,sysdirname=sys.argv[1]i=10001for f in os.listdir(dirname):src=os.path.join(dirname,f)if os.path.isdir(src):continueos.rename(src,str(i))i =1

os.chkdir(path) 转换到目录path 下。

os.system('md a') 可以直接创建目录。

os.name字符串指示你正在使用的平台。比如对于Windows,它是'nt',而对于Linux/Unix用户,它是'posix'。
● os.getcwd()函数得到当前工作目录,即当前Python脚本工作的目录路径。
● os.getenv()和os.putenv()函数分别用来读取和设置环境变量。
● os.listdir()返回指定目录下的所有文件和目录名。
● os.remove()函数用来删除一个文件。
● os.system()函数用来运行shell命令。
● os.linesep字符串给出当前平台使用的行终止符。例如,Windows使用'\r\n',Linux使用'\n'而Mac使用'\r'。
● os.path.split()函数返回一个路径的目录名和文件名。
>>> os.path.split('/home/swaroop/byte/code/poem.txt')
('/home/swaroop/byte/code', 'poem.txt')
● os.path.isfile()和os.path.isdir()函数分别检验给出的路径是一个文件还是目录。类似地,os.path.exists()函数用来检验给出的路径是否真地存在。

文件重定向

已有PY文件new1.py ,在命令行下输入:new1>new.txt 可以将new1运行的结果输出到文件new.txt,这称为流重定向。

关于python编写shell脚本的方法就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

文件 目录 函数 命令 路径 指向 脚本 变量 环境 代表 参数 名字 文件名 时间 目录名 两个 字符 字符串 模块 符号 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 vps web 服务器 国家网络安全有关要求 数据库系统应用层建模 天津语音网络技术服务产品介绍 电脑代理服务器为什么会被篡改 当代小学生网络安全 新闻资讯软件开发需求分析 深耕网络安全管理 怎么区分软件开发和销售 当前数据库在线登录 网络安全网络培训学校 c 上位机软件开发技巧 热血传奇开放服务器 网络安全等级保护条例正式版下载 软件开发的面试题宝典 云服务器管理控制台下载 数据库update很慢 安全服务器构建实训日志 wiley数据库使用 税控盘显示正在上传数据库 网络安全毕业后可以从事什么工作 新罗区雨花台网络技术服务部 电大数据库基础应用考试答案 网络安全与信息化办公室 什么是数据库分表分库 腾讯课堂为什么音频服务器会断开 程序设计与数据库技术 二级 阿里服务器怎么开设数据库 云服务器管理控制台下载 步道乐跑服务器崩了多久能恢复
0