当我们在Python中需要执行一些系统级的任务,比如创建、删除、移动、查找文件或文件夹,或者直接调用Linux下的Shell命令实现一些特殊的功能时,我们可以使用Python的subprocess模块来实现。下面就是Python下调用Linux的Shell命令的方法的完整攻略:
确定要执行的Shell命令
首先,我们要明确要调用的Shell命令。可以通过在Linux系统的终端中手动输入要执行的命令来测试是否能够正常运行,比如:
$ ls -l /home/username
如果这个命令输出了/home/username中的文件列表,那么这个命令就是可行的,可以在Python中调用它。
使用subprocess模块调用Shell命令
在Python的subprocess模块中,我们可以使用subprocess.call
函数来调用Shell命令,并且可以将这个命令的输出和错误输出捕获到Python的变量中。具体的调用方式如下所示:
import subprocess
# 定义要执行的Shell命令
command = "ls -l /home/username"
# 调用subprocess.call函数执行Shell命令,捕获结果输出和错误输出
result = subprocess.run(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
# 将输出结果和错误输出转换为字符串并输出
print(result.stdout.decode())
print(result.stderr.decode())
在上面的代码中,subprocess.run
函数接收了需要执行的Shell命令、标准输出硬链接到变量stdout
和标准错误输出硬链接到变量stderr
,然后使用了shell=True
参数来允许执行Shell命令。执行完毕之后,我们可以将输出结果和错误结果分别使用stdout.decode()
和stderr.decode()
方法转换为字符串,在Python中显示输出。
示例:查找文件
现在,我们来看一个通过Python调用Linux的Shell命令实现查找文件的示例。假设我们想在/home/username文件夹中查找所有扩展名为.txt的文件,我们可以使用find
和grep
命令结合的方式来实现:
$ find /home/username -name "*.txt" | grep -v ".svn"
现在,我们可以将这个命令封装成一个Python函数:
import subprocess
def search_files(folder, extension):
command = "find %s -name \'*%s\' | grep -v \".svn\"" % (folder, extension)
result = subprocess.run(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
return result.stdout.decode()
# 在/home/username中查找所有扩展名为.txt的文件
folder = "/home/username"
extension = "txt"
result = search_files(folder, extension)
print(result)
在这个示例中,我们首先封装了一个函数search_files
,这个函数接收需要查找的文件夹路径和文件的扩展名作为参数,并且调用了find
和grep
两个命令来实现查找文件。最后将输出结果作为函数返回值返回。在Python中我们可以直接调用这个函数来实现查找文件的功能。
示例:执行统计命令
现在,我们来看一个通过Python调用Linux统计命令实现的示例。假设我们想获取Linux系统上当前运行的进程数、系统CPU的空闲时间以及当前系统内存的使用率,我们可以使用top
和awk
命令结合的方式来实现:
$ top -bn1 | grep "Cpu(s)" | sed "s/.*, *\([0-9.]*\)%* id.*/\1/" | awk '{print "CPU使用率: " 100 - $1"%"}'
$ free -m | awk 'NR==2{printf "内存使用率: %.2f%%\n", $3*100/$2}'
$ ps -ef |wc -l
可以将这个命令封装成一个Python函数如下:
import subprocess
def system_status():
result = {}
# 获取CPU使用率
command = "top -bn1 | grep 'Cpu(s)' | sed 's/.*, *\\([0-9.]*\\)%* id.*/\\1/' | awk '{print \"CPU使用率: \" 100 - $1\"%\"}'"
cpu_usage = subprocess.run(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
result['CPU使用率'] = cpu_usage.stdout.decode()
# 获取内存使用率
command = "free -m | awk 'NR==2{printf \"内存使用率: %.2f%%\", $3*100/$2}'"
mem_usage = subprocess.run(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
result['内存使用率'] = mem_usage.stdout.decode()
# 获取运行进程数
command = "ps -ef |wc -l"
process_count = subprocess.run(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
result['运行进程数'] = str(int((process_count.stdout.decode())) - 1)
return result
# 执行统计命令
result = system_status()
print(result)
在这个示例中,我们封装了一个函数system_status
来执行了三个统计命令,分别是获取CPU使用率、获取内存使用率和获取运行进程数。最后,我们将这三条命令的结果合并到一个字典中,并将结果作为函数返回值返回。在Python中,我们可以直接调用这个函数来实现获取系统状态的功能。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python下调用Linux的Shell命令的方法 - Python技术站