欢迎访问宙启技术站
智能推送

在Python中使用run()函数并捕获异常的方法及示例

发布时间:2024-01-02 04:06:17

在Python中,可以使用subprocess.run()函数来运行外部命令,并捕获运行时可能抛出的异常。subprocess.run()函数是Python 3.5及以上版本的标准库函数,用于替代旧的subprocess.call()函数,并提供更方便的用法。

subprocess.run()函数的基本语法如下:

subprocess.run(args, *, stdin=None, input=None, stdout=None, stderr=None, capture_output=False, shell=False, cwd=None, timeout=None, check=False, encoding=None, errors=None, text=None, env=None, universal_newlines=None)

- args:要执行的命令,可以是一个字符串或一个字符串列表。

- stdin:用于传递输入给命令的文件对象。

- input:用于传递输入给命令的字符串。

- stdout:用于接收命令输出的文件对象。

- stderr:用于接收命令错误输出的文件对象。

- capture_output:如果此参数为True,则将标准输出和错误输出捕获到结果对象的stdout和stderr属性中。

- shell:如果此参数为True,则在一个新进程中执行命令时,将使用shell来解释命令行。

- cwd:指定命令运行的当前工作目录。

- timeout:命令运行的超时时间,超过此时间则会抛出TimeoutExpired异常。

- check:如果此参数为True,并且命令返回值不为0,则会抛出CalledProcessError异常。

下面是一个使用subprocess.run()函数的例子,示范如何运行外部命令并捕获异常:

import subprocess

# 运行命令'ls',并将输出发送到标准输出
result = subprocess.run(['ls'], capture_output=True, text=True)

# 输出命令的返回值
print('返回值:', result.returncode)

# 输出命令的标准输出
print('标准输出:', result.stdout)

# 输出命令的标准错误
print('标准错误:', result.stderr)

在上面的例子中,我们使用subprocess.run()函数运行了命令'ls'(在Unix系统中列出目录内容),并将输出捕获到了result对象中。然后,我们可以通过result.returncode属性获取命令的返回值,通过result.stdout属性获取命令的标准输出,通过result.stderr属性获取命令的标准错误。

除了捕获命令的输出,subprocess.run()函数还可以捕获命令的输入。下面是一个示例,演示如何向命令传递输入和获取输出:

import subprocess

# 向命令'grep'传递输入,并获取输出
result = subprocess.run(['grep', 'apple'], input='apple banana
apple orange
', capture_output=True, text=True)

# 输出命令的返回值
print('返回值:', result.returncode)

# 输出命令的输出
print('输出:', result.stdout)

在上面的例子中,我们使用subprocess.run()函数运行了命令'grep'(在Unix系统中查找包含关键词的行),并向命令传递了输入字符串'apple banana

apple orange

'。然后,我们通过result.returncode属性获取命令的返回值,通过result.stdout属性获取命令的输出。

除了直接捕获命令的输出,subprocess.run()函数还可以将输出保存到文件中。例如,下面的例子将命令的输出保存到文件中,然后再读取出来以显示:

import subprocess

# 运行命令'ls',并将输出保存到文件'output.txt'
with open('output.txt', 'w') as f:
    subprocess.run(['ls'], stdout=f)

# 从文件'output.txt'中读取命令的输出
with open('output.txt', 'r') as f:
    output = f.read()

# 输出命令的输出
print(output)

在上面的例子中,我们使用subprocess.run()函数运行了命令'ls',并将输出保存到文件'output.txt'中。然后,我们通过读取文件'output.txt'来获取命令的输出,并打印出来。

在使用subprocess.run()函数时,如果命令返回值不为0,可以通过设置check=True参数来抛出异常。下面是一个示例,演示如何捕获异常并处理:

import subprocess

try:
    # 运行命令'cmd_not_exist'
    subprocess.run(['cmd_not_exist'], check=True)
except subprocess.CalledProcessError as e:
    print('命令返回值不为0')
    print('返回值:', e.returncode)
    print('标准输出:', e.stdout)
    print('标准错误:', e.stderr)

在上面的例子中,我们试图运行一个不存在的命令'cmd_not_exist'。由于该命令不存在,所以命令的返回值不为0,此时subprocess.run()函数会抛出CalledProcessError异常。在异常处理代码块中,我们可以通过异常对象的属性获取命令的返回值、标准输出和标准错误,并进行相应的处理。

综上所述,使用subprocess.run()函数并捕获异常的方法是非常简单的。可以根据具体的需求,使用subprocess.run()函数的不同参数来运行命令、传递输入、获取输出,并通过异常处理来处理命令可能抛出的异常。