Python3执行Linux命令

Python3执行Linux命令

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命令,并获取命令的输出和返回码。这为我们处理一些特殊的操作提供了便利,同时也增强了程序的功能性和扩展性。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程