用Python写Shell脚本

2022-11-15 21:23:44 浏览数 (3)

Python调用Shell命令

os.system

os.system函数与系统编程中的exec族函数调用一致,创建出子进程后代码段由外部程序替换,不会返回外部程序运行结果

代码语言:javascript复制
import os

os.system('ls -l')

os.popen

os.popen返回的是一个文件对象,它将外部程序运行结果保存在文件对象中,当调用其read方法时就会得到运行结果。该方法可以得到外部程序的运行结果

代码语言:javascript复制
import os

os.popen('ls -l').read()

res = os.popen('ls').read()
if 'a.c' in res:
    print('a.c in this')
else:
    print('a.c not in this')

commands.getoutput

commands模块只能在Python2中使用,Python3将其移除了。commands.getoutput方法直接将外部程序的输出结果作为字符串返回了

代码语言:javascript复制
import commands

commands.getoutput('ls -l')        # 返回输出结果
commands.getstatusoutput('ls -l')  # 返回(状态码, 输出结果)

subprocess.call

Python3中引入的模块,在Python3中推荐使用该模块。subprocess.call将外部程序的输出结果输出并返回状态码

代码语言:javascript复制
from subprocess improt call

# 可以将命令和参数以列表的形式传入
code = call(['ls', '-l', '-a'])

# 也可以用字符串作为传入的参数(通过设置参数shell=True)
code = call('ls -l -a', shell=True)

文件操作API

创建文件

代码语言:javascript复制
import os

# touch a.c
file = open('a.c', 'w')
file.close()

# mkdir dir
os.mkdir('dir')

# mkdir -p dir1/dir2
os.mkdirs('dir1/dir2')

# ln a.c b.c
os.link('a.c', 'b.c')

# ln -s a.c b.c
os.symlink('a.c', 'b.c')

删除文件

代码语言:javascript复制
import os

# rm a.c
os.remove('a.c')

# rm -r dir
os.rmdir('dir')

复制文件

代码语言:javascript复制
import shutil

# 参数src为源文件名字,参数dst为目标文件或目录名字
# shutil.copy(src, dst)
# shutil.copy2(src, dst)

# cp a.c b.c
shutil.copy('a.c', 'b.c')

# cp a.c dir/b.c
shutil.copy('a.c', 'dir/')

# cp -p a.c b.c
shutil.copy2('a.c', 'b.c')

# 参数src为源目录名字,dst为目标目录名字
# shutil.copytree(srd, dst)

# cp dir1 dir2 -r
shutil.copytree('dir1', 'dir2')

移动文件或重命名

代码语言:javascript复制
import shutil

# shutil.move(src, dst)

# mv a.c b.c
shutil.move('a.c', 'b.c')

其他

代码语言:javascript复制
import os

# 切换当前工作目录到/home/ifantsai/下
os.chdir('/home/ifantsai/')

# 返回当前工作目录
work_path = os.getcwd()

# 改变当前进程的根目录为当前目录
os.chroot('./')

# 改变a.c的权限为777
os.chmod('a.c', os.S_IRWXU or os.S_IRWXG or os.S_IRWXO)

# 改变文件的属主
os.chown('a.c', uid, gid)

# 返回b.c这个符号链接所指向的路径
path = os.readlink('b.c')

注: 路径相关操作在os.path模块中。命令行参数在sys模块中, sys.argc为参数个数,sys.argv为参数列表,其中sys.argv[0]为程序本身

本文作者: Ifan Tsai  (菜菜)

本文链接: https://cloud.tencent.com/developer/article/2164587

版权声明: 本文采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。转载请注明出处!

0 人点赞