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

使用Python的run()函数运行外部命令

发布时间:2023-12-24 16:17:33

Python的run()函数是subprocess模块中的一个函数,用于运行外部命令。它可以将命令以子进程的形式执行,并返回执行结果。

函数定义如下:

subprocess.run(args, *, stdin=None, input=None, stdout=None, stderr=None, shell=False, timeout=None, check=False, encoding=None, errors=None, env=None, universal_newlines=None, cwd=None, startupinfo=None, creationflags=0, restore_signals=True, start_new_session=False, pass_fds=(), prog=None)

参数说明如下:

- args:命令行参数。可以是字符串、列表或元组类型。字符串会被shell解析,列表或元组会直接传递给启动的进程。

- stdin:用于输入到子进程的数据。可以是PIPE(管道), DEVNULL(空设备), 文件描述符及可读流对象。

- input:与stdin相同效果,但只接受字节类型的输入。

- stdout:存储子进程标准输出的地方。可以是PIPE, DEVNULL, 文件描述符及可写流对象。

- stderr:存储子进程标准错误的地方。可以是PIPE, DEVNULL, 文件描述符及可写流对象。

- shell:如果为True,则在shell中执行命令。默认为False

- timeout:超时时间,以秒为单位。默认为None,即不设定超时时间。

- check:如果为True,则如果命令返回非零值,将引发CalledProcessError异常。默认为False

- encoding:指定从子进程读取输出时使用的编码。默认为None,即以字节形式获取输出。

- errors:与encoding一起使用,指定编码错误时的处理方式。默认为None

- env:传递给子进程的环境变量。默认为当前环境变量。

- universal_newlines:如果为True,则会将输入、输出和错误流作为文本流处理。默认为False

- cwd:在执行命令时要切换到的工作目录。默认为None,即使用当前工作目录。

- 其他参数,请参考[官方文档](https://docs.python.org/3/library/subprocess.html#subprocess.run)。

下面是一个使用run()函数运行外部命令的例子:

import subprocess

# 使用PIPE将命令输出作为文本获取
result = subprocess.run(['ls', '-l'], capture_output=True, text=True)
print(result.stdout)

# 使用check参数检查命令是否执行成功
try:
    result = subprocess.run('bad_command', check=True)
except subprocess.CalledProcessError as e:
    print(f'Command execution failed with exit code {e.returncode}.')

这个例子中,首先使用run()函数执行了ls -l命令,并将其输出作为文本获取,并打印出输出结果。

然后,使用run()函数执行了一个不存在的命令bad_command,由于check=True,因此命令执行失败,抛出了CalledProcessError异常,我们在except语句中捕获了异常,并打印了命令执行失败的信息。

注意,run()函数会在子进程执行时阻塞主进程,直到子进程执行完毕才会继续执行后续代码。如果要在子进程执行期间同时执行其他代码,可以考虑使用Popen类。另外,run()函数在Python 3.5及以上版本可用。