Python3执行Linux命令
1. 前言
在日常的编程工作中,有时我们需要在Python程序中执行一些系统命令,以完成一些特殊的操作。Python提供了多种执行系统命令的方式,本文将详细介绍以Python3为例,如何执行Linux命令。
2. os模块
Python的os模块提供了很多与操作系统交互的函数,其中就包含了执行系统命令的功能。下面是使用os模块执行系统命令的基本语法:
import os
os.system('command')
其中,command
是要执行的Linux命令,可以是任何有效的Linux命令。os.system()
函数的返回值是命令执行状态,一般来说,如果命令执行成功,它的返回值为0,如果命令执行失败,返回值为其他非零值。
下面是一个简单的示例,演示了如何在Python程序中执行Linux的ls
命令,并输出:
import os
status = os.system('ls')
print(status)
运行结果如下:
Desktop Documents Downloads Music Pictures Public Templates Videos
0
可以看到,执行成功的结果返回值为0。
需要注意的是,os.system()
函数只会执行命令并返回命令执行的状态,它不会将命令的输出保存下来。如果我们需要获取命令执行的输出,可以使用subprocess
模块。
3. subprocess模块
Python的subprocess模块提供了更加灵活和强大的执行系统命令的方式。它可以执行复杂的命令,并获取命令的输出,并且支持输入/输出重定向、管道等特性。
3.1 subprocess.run()
subprocess.run()
函数是Python3.5及以上版本新增的函数,它是执行系统命令的最简单的方式。下面是subprocess.run()
函数的基本语法:
import subprocess
completed_process = subprocess.run('command', shell=True, capture_output=True, text=True)
其中,command
是要执行的Linux命令,可以是任何有效的Linux命令。shell
参数指定是否使用shell执行命令,如果为True,则使用shell执行命令;如果为False,则直接执行命令,不使用shell。capture_output
参数用于捕获命令的输出,如果为True,则捕获命令的输出;如果为False,则不捕获命令的输出。text
参数用于指定命令的输入输出是否为文本模式,如果为True,则输入输出都将以文本模式进行;如果为False,则使用字节模式。
subprocess.run()
函数的返回值是一个CompletedProcess
对象,可以通过该对象的属性来获取命令执行的结果,包括命令的输出、返回码等。
下面是一个示例,演示了如何使用subprocess.run()
函数执行Linux的ls
命令,并获取命令的输出和返回码:
import subprocess
completed_process = subprocess.run('ls', shell=True, capture_output=True, text=True)
print(completed_process.stdout)
print(completed_process.returncode)
运行结果如下:
Desktop
Documents
Downloads
Music
Pictures
Public
Templates
Videos
0
可以看到,completed_process.stdout
属性保存了命令的输出,completed_process.returncode
属性保存了命令的返回码。
需要注意的是,subprocess.run()
函数默认是使用shell来执行命令的,这样可能会存在一些潜在的安全风险,因为shell会对命令进行解析和处理。因此,为了避免安全问题,如果命令中涉及到用户输入的内容,最好将shell
参数设置为False,以避免潜在的安全漏洞。
3.2 subprocess.Popen()
subprocess.Popen()
函数是一个更加底层、灵活的函数,它可以执行复杂的命令,并控制命令的输入输出。下面是subprocess.Popen()
函数的基本语法:
import subprocess
process = subprocess.Popen('command', shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)
其中,command
是要执行的Linux命令,可以是任何有效的Linux命令。shell
参数指定是否使用shell执行命令,如果为True,则使用shell执行命令;如果为False,则直接执行命令,不使用shell。stdout
参数指定命令的标准输出,可以是一个文件描述符、一个文件对象或者一个字符串。默认为None,表示不捕获标准输出。stderr
参数指定命令的标准错误输出,可以是一个文件描述符、一个文件对象或者一个字符串。默认为None,表示不捕获标准错误输出。text
参数用于指定命令的输入输出是否为文本模式,如果为True,则输入输出都将以文本模式进行;如果为False,则使用字节模式。
subprocess.Popen()
函数的返回值是一个Popen
对象,可以通过该对象的方法和属性来控制命令的输入输出,以及获取命令的执行结果。
下面是一个示例,演示了如何使用subprocess.Popen()
函数执行Linux的ls
命令,并获取命令的输出:
import subprocess
process = subprocess.Popen('ls', shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)
stdout, stderr = process.communicate()
print(stdout)
运行结果如下:
Desktop
Documents
Downloads
Music
Pictures
Public
Templates
Videos
可以看到,communicate()
方法返回了命令的输出。
需要注意的是,subprocess.Popen()
函数默认是使用shell来执行命令的,因此,同样要尽量避免使用shell执行命令时,传入用户输入的内容,以避免潜在的安全漏洞。
4. 示例代码
下面是一个完整的示例,演示了如何使用subprocess
模块执行Linux命令,并获取命令的输出和返回码:
import subprocess
def run_command(command):
try:
completed_process = subprocess.run(command, shell=True, capture_output=True, text=True)
return completed_process.stdout, completed_process.returncode
except Exception as e:
return '', -1
command = 'ls -l'
output, returncode = run_command(command)
print(f'Output:\n{output}')
print(f'Returncode: {returncode}')
运行结果如下:
Output:
total 4
-rw-r--r-- 1 user user 64 Nov 10 15:35 test.txt
Returncode: 0
可以看到,示例代码通过subprocess.run()
函数执行了ls -l
命令,并获取了命令的输出和返回码。
5. 总结
本文介绍了如何使用Python3执行Linux命令。通过os模块的os.system()
函数可以简单地执行系统命令,但它不会捕获命令的输出。如果需要获取命令的输出,可以使用subprocess
模块。subprocess
模块提供了两个主要的函数,即subprocess.run()
和subprocess.Popen()
。
subprocess.run()
是Python3.5及以上版本新增的函数,它可以执行系统命令,并获取命令的输出和返回码。通过shell
参数可以决定是否使用shell来执行命令,capture_output
参数可以决定是否捕获命令的输出,text
参数用于指定输入输出的模式(文本模式或字节模式)。示例代码演示了如何使用subprocess.run()
执行Linux的ls
命令,并获取输出和返回码。
subprocess.Popen()
是一个更加底层、灵活的函数,它可以执行复杂的命令,并控制命令的输入输出。通过stdout
参数和stderr
参数可以分别指定命令的标准输出和标准错误输出。示例代码演示了如何使用subprocess.Popen()
执行Linux的ls
命令,并获取输出。
需要注意的是,当使用subprocess
模块执行命令时,尽量避免使用带有用户输入内容的命令,并且要将shell
参数设置为False,以防止潜在的安全风险。
总之,通过Python3的subprocess
模块,我们可以方便地在程序中执行Linux命令,并获取命令的输出和返回码。这为我们处理一些特殊的操作提供了便利,同时也增强了程序的功能性和扩展性。