Python 执行 cmd 命令获取返回值
引言
在开发中,我们经常会遇到需要执行一些命令行指令并获取返回值的情况。对于在 Windows 系统上使用 Python 的开发者来说,执行 cmd 命令是一种常见的操作。本文将介绍如何使用 Python 执行 cmd 命令并获取返回值的方法。
1. 使用 subprocess 模块执行 cmd 命令
Python 提供了 subprocess
模块,该模块可以用于创建新的进程,执行外部命令,并与其进行通信。我们可以利用该模块执行 cmd 命令,并获取其返回值。
下面是一个示例代码,演示了如何使用 subprocess
模块执行 cmd 命令并获取返回值:
上述代码中,我们使用 subprocess.check_output()
方法执行了 dir
命令,将其返回值保存在 result
变量中。然后,我们使用 decode()
方法将返回的字节流解码为字符串,并将其打印输出。
输出结果如下所示:
驱动器 D 中的卷是 DATA
卷的序列号是 000F-9D21
D:\Work
2021/09/20 09:18 <DIR> .
2021/09/20 09:18 <DIR> ..
2021/09/20 08:45 <DIR> dir_example
2021/09/20 09:18 0 test.txt
1 个文件 0 字节
3 个目录 116,380,649,472 可用字节
可以看到,我们成功执行了 dir
命令,并获取了其返回值。
2. 使用 os 模块执行 cmd 命令
除了使用 subprocess
模块外,我们还可以使用内置的 os
模块来执行 cmd 命令,并获取其返回值。
下面是一个示例代码,演示了如何使用 os.system()
方法执行 cmd 命令并获取返回值:
上述代码中,我们使用 os.popen().read()
方法执行了 dir
命令,并将其返回值保存在 result
变量中。然后,我们直接打印输出了该返回值。
输出结果与前面使用 subprocess
模块的示例代码相同。
需要注意的是,os.popen()
方法返回的是一个文件对象,我们可以通过调用其 read()
方法来获取返回值。
3. 使用 popen 方法执行命令并获取返回值
除了使用 os
模块的 popen()
方法,我们还可以使用 subprocess
模块的 Popen
类来执行命令,并获取其返回值。
下面是一个示例代码,演示了如何使用 subprocess.Popen
类执行 cmd 命令并获取返回值:
上述代码中,我们使用 subprocess.Popen()
方法执行了 dir
命令,并将其返回值保存在 result
变量中。我们通过 stdout
参数将输出重定向到管道中,然后使用 communicate()
方法获取输出结果。最后,我们将返回的字节流解码为字符串并打印输出。
输出结果与前面的示例代码相同。
需要注意的是,使用 subprocess.Popen()
方法执行命令时,需要指定 stdout=subprocess.PIPE
参数,将输出重定向到管道中。然后,我们可以通过调用 communicate()
方法来获取管道中的输出。
4. 执行命令时传递参数
在使用 Python 执行 cmd 命令时,我们可以传递参数给命令,并获取其返回值。下面是一个示例代码,演示了如何执行带有参数的 cmd 命令:
上述代码中,我们使用 subprocess.check_output()
方法执行了带有参数的 ping
命令,其中 -n 3
表示发送 3 个 ICMP Echo 请求报文。然后,我们将返回的字节流解码为字符串并打印输出。
输出结果如下所示:
可以看到,我们成功执行了带有参数的 ping
命令,并获取了其返回值。
5. 错误处理
在执行命令时,有时可能会出现错误。为了确保程序的健壮性,我们应该进行错误处理。
下面是一个示例代码,演示了如何处理执行命令时可能抛出的异常:
上述代码中,我们在 try
块中执行了一个未知命令 unknown_command
,由于该命令不存在,会抛出 CalledProcessError
异常。在 except
块中,我们捕获了该异常,并输出错误信息。
输出结果如下所示:
执行命令时出现错误:Command 'unknown_command' returned non-zero exit status 1.
可以看到,我们成功捕获到了执行命令时的错误,并输出了详细的错误信息。
结论
本文介绍了如何使用 Python 执行 cmd 命令并获取返回值的方法。我们可以使用 subprocess
模块的 check_output()
方法、os
模块的 popen()
方法,或者 subprocess.Popen
类来执行 cmd 命令。同时,我们还可以传递参数给命令,并获取其返回值。在执行命