python 如何获取os.system执行后的结果
在Python中,可以使用os.system()
函数来执行系统命令。但是,os.system()
函数只会执行命令,不会返回命令的输出。如果我们想要获取命令执行后的结果,我们可以使用一些其他的方法来实现。
使用subprocess模块
subprocess
模块是Python的标准库之一,提供了更强大和灵活的方法来执行外部命令,并获取命令执行后的输出。
下面是一个使用subprocess
模块获取命令执行结果的示例代码:
import subprocess
# 执行命令
result = subprocess.run(['ls', '-l'], stdout=subprocess.PIPE)
# 获取命令执行后的输出
output = result.stdout.decode('utf-8')
print(output)
在上面的示例中,subprocess.run()
函数接收一个命令列表作为参数,并设置stdout=subprocess.PIPE
来将命令执行后的输出捕获到result.stdout
中。然后通过decode()
函数将二进制输出转换为字符串,并打印输出。
运行上面的代码,可以获取到执行ls -l
命令后的结果,输出类似于下面的内容:
total 496
-rw-r--r--@ 1 user staff 263 Aug 4 10:53 README.md
-rw-r--r--@ 1 user staff 1795 Aug 4 11:15 main.py
使用subprocess模块获取命令执行结果和状态码
除了获取命令执行结果,我们还可以获取命令执行的状态码。状态码是一个整数,表示命令执行的结果。
下面是一个使用subprocess
模块获取命令执行结果和状态码的示例代码:
import subprocess
# 执行命令
result = subprocess.run(['ls', '-l', 'non_exist_file'], stdout=subprocess.PIPE)
# 获取命令执行后的输出
output = result.stdout.decode('utf-8')
# 获取命令执行的状态码
status_code = result.returncode
print('Output:')
print(output)
print('Status Code:', status_code)
在上面的示例中,我们故意传递一个不存在的文件名给ls
命令,以触发一个错误。执行上面的代码,输出如下:
ls: non_exist_file: No such file or directory
Output:
Status Code: 1
可以看到,当命令执行出错时,result.returncode
会返回非零状态码,从而表示命令执行失败。
使用Popen对象逐行获取命令输出
有时候,我们可能需要逐行获取命令执行后的输出,而不是一次性获取所有输出。这时候,可以使用subprocess.Popen
对象来实现。
下面是一个使用subprocess.Popen
逐行获取命令输出的示例代码:
import subprocess
# 执行命令
process = subprocess.Popen(['ls', '-l'], stdout=subprocess.PIPE)
# 逐行获取命令输出
for line in process.stdout:
print(line.decode('utf-8').strip())
process.communicate()
在上面的示例中,我们使用Popen()
函数创建一个子进程来执行ls -l
命令,并通过迭代process.stdout
来逐行获取命令输出。最后,调用process.communicate()
来等待子进程执行完毕。
小结
通过subprocess
模块,我们可以方便地执行系统命令,并获取命令执行后的结果。同时,subprocess
模块还提供了丰富的方法来处理命令执行的输出和错误信息,让我们能够更灵活地使用外部命令。