一、os.system(“command”)
这是python自带的执行shell命令的方法,其中最后一个0是这个命令的返回值,为0表示命令执行成功。但是使用system()无法将执行的结果保存起来。
1 2 3 | import os print (os.system( "touch a.txt" )) |
它也会返回一个0,但是这个命令执行的结果却没有办法查看,即system函数不返回shell命令执行的结果。
二、os.popen("command")方法
上面的os.system()方法没办法查看shell命令返回的结果,通过 os.popen() 返回的是 file read 的对象,对其进行读取 read() 的操作可以看到执行的输出。
注意:os.popen() 返回的是一个文件对象f哦!!!
1 2 3 4 5 6 7 8 9 | import os f = os.popen( "ls -l" ) # 返回的是一个文件对象 print (f.read()) # 通过文件的read()读取所返回的内容 ''' total 4 -rw-rw-r-- 1 tengjian tengjian 0 11月 5 09:32 a.txt -rw-rw-r-- 1 tengjian tengjian 81 11月 5 09:32 python_shell.py ''' |
对于那些没有返回指的shell命令,我依然也可以使用popen()方法,如下:
1 2 3 4 5 | import os f = os.popen( "touch b.txt" ) # 创建一个文件 # f=os.popen("mkdir newdir") # 创建一个新的文件夹 print (f.read()) |
总结:
1 2 | 对于有返回值的shell命令,建议使用 os.popen() 对于没有返回值的shell命令,建议使用 os.system() |
当然除了python系统自带的os模块的这两个方法,还有很多其他的方法可以实现shell命令操作,下面介绍几个。
三、通过subprocess模块
subprocess模块是python从2.4版本开始引入的模块,也是系统自带的,不需要再额外安装了。主要用来取代 一些旧的模块方法,如os.system、os.spawn*、os.popen*、commands.*等。subprocess通过子进程来执行外部指令,并通过input/output/error管道,获取子进程的执行的返回信息。
3.1 常用方法:
(1)subprocess.call():执行命令,并返回执行状态,其中shell参数为False时,命令以及命令的参数需要通过列表的方式传入,当shell为True时,可通过一个字符串直接传入命令以及命令所需要的参数
1 2 3 4 5 6 7 8 9 10 11 | import subprocess print (subprocess.call([ "ls" , "-l" ],shell = False )) # shell参数为false,则,命令以及参数以列表的形式给出 ''' total 8 -rw-rw-r-- 1 tengjian tengjian 0 11月 5 09:32 a.txt -rw-rw-r-- 1 tengjian tengjian 0 11月 5 09:33 b.txt drwxrwxr-x 2 tengjian tengjian 4096 11月 5 09:32 hahaha -rw-rw-r-- 1 tengjian tengjian 119 11月 5 10:22 python_shell.py 0 ''' |
最后一个状态0,表示命令执行成功。
1 2 3 4 5 6 7 | import subprocess a = subprocess.call([ "ls" , "-l" ],shell = False ) # shell参数为false,则,命令以及参数以列表的形式给出 print (a) ''' 0 此时只返回0表示执行成功 ''' |
当shell参数为True的时候:
1 2 3 4 5 6 7 8 9 10 11 | import subprocess print (subprocess.call( "ls -l" ,shell = True )) # shell参数为true,则,命令以及参数以字符串的形式给出 ''' total 8 -rw-rw-r-- 1 tengjian tengjian 0 11月 5 09:32 a.txt -rw-rw-r-- 1 tengjian tengjian 0 11月 5 09:33 b.txt drwxrwxr-x 2 tengjian tengjian 4096 11月 5 09:32 hahaha -rw-rw-r-- 1 tengjian tengjian 119 11月 5 10:22 python_shell.py 0 ''' |
当然对于一些没有返回值的shell命令,也可以同样的操作,如下:
1 2 3 4 | import subprocess print (subprocess.call([ "touch" , "c.txt" ],shell = False )) # 直接返回0,表示操作成功 print (subprocess.call([ "mkdir newdir1" ],shell = True )) # 直接返回0,表示操作成功 |
(2)subprocess.check_call():用法与subprocess.call()类似,区别是,当返回值不为0时,直接抛出异常,这里不再赘述了。\
(3)subprocess.check_output():用法与上面两个方法类似,区别是,如果当返回值为0时,直接返回输出结果,如果返回值不为0,直接抛出异常。需要说明的是,该方法在python3.x中才有。
1 2 3 4 5 6 7 8 | import os import subprocess a = subprocess.check_output([ "ls" , "-l" ],shell = False ) print (a) # 不是直接返回0了,而是直接返回执行结果的内容 ''' b'total 8\n-rw-rw-r-- 1 tengjian tengjian 0 11\xe6\x9c\x88 5 09:32 a.txt\n-rw-rw-r-- 1 tengjian tengjian 0 11\xe6\x9c\x88 5 09:33 b.txt\n-rw-rw-r-- 1 tengjian tengjian 0 11\xe6\x9c\x88 5 10:25 c.txt\ndrwxrwxr-x 2 tengjian tengjian 4096 11\xe6\x9c\x88 5 09:32 hahaha\n-rw-rw-r-- 1 tengjian tengjian 181 11\xe6\x9c\x88 5 10:33 python_shell.py\n' ''' |
注意:subprocess的功能还有更多,比如还有Popen类
subprocess模块中定义了一个Popen类,通过它可以来创建进程,并与其进行复杂的交互
四、通过sh库
首先安装sh库 :pip install sh
Python 是一种伟大的脚本语言,不过有时使用标准 os 和 subprocess 库会有点棘手。
sh 库提供了一种不错的替代方案。
sh 库:http://amoffat.github.io/sh/
库允许用户像使用普通函数一样调用任意程序,这对自动化工作流和任务非常有用。
它的一般工作模式如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | sh.command_name( "参数一" , "参数二" , "参数三" ) import sh sh.pwd() sh.mkdir( new_folder ) sh.touch( new_file.txt ) sh.whoami() sh.echo( This is great! ) sh.ls( "-l" ) # 等价于 ls -l print (sh.ls( "-l" )) sh.df( "-h" ) # 等价于 df -h print (sh.df( "-h" )) # 当有多个参数的情况,且参数可以赋值 sh.du( "-h" , "-d 1" ) # 等价于 du -h -d 1 print (sh.du( "-h" , "-d 1" )) |
注意:上面在通过 sh.** 编写的时候可能没有代码提示,因为sh模块里面并没有直接定义 像上面的
pwd(),touch(),du()等这些函数,他是通过其他的方式实现的,所以没有智能敏感提示。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
2021-01-29 Qt利用setStyleSheet设置样式
2019-01-29 决策树和随机森林
2019-01-29 朴素贝叶斯
2019-01-29 k近邻算法(KNN)
2019-01-29 模型训练与优化