📜  使用Python执行 Shell 命令(1)

📅  最后修改于: 2023-12-03 15:06:53.504000             🧑  作者: Mango

使用Python执行Shell命令

在Python中,如果需要执行一些Shell命令,我们可以使用标准库中的subprocess模块来实现。subprocess模块可以让我们方便地在Python程序中执行外部命令,并获取其输出。

下面我们来介绍一些subprocess模块的常用方法和应用场景。

常用方法
subprocess.run()

subprocess.run()是执行外部命令的最基本方法,它的语法如下:

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

其中,args指定了要执行的命令,可以是一个字符串或者一个字符串列表。如果args是一个字符串,需要将shell参数设置为True。

下面是一个例子:

import subprocess

result = subprocess.run('ls -l', shell=True, stdout=subprocess.PIPE)

print(result.stdout.decode())

在这个例子中,我们使用subprocess.run()来执行ls命令,并将输出结果存储在result变量中。stdout=subprocess.PIPE表示我们将结果重定向到标准输出,然后使用stdout属性来获取输出结果。

subprocess.call()

subprocess.call()是subprocess.run()的一个简化版本,只返回命令的退出代码,不会返回命令的输出。其语法如下:

subprocess.call(args, *, stdin=None, stdout=None, stderr=None, shell=False, timeout=None, check=False, encoding=None, errors=None, env=None, universal_newlines=None)

下面是一个例子:

import subprocess

result = subprocess.call('ls')

在这个例子中,我们使用subprocess.call()来执行ls命令,它只返回命令的退出代码,不返回输出结果。

subprocess.Popen()

subprocess.Popen()方法是最灵活的方法,它能够启动一个新的进程并与之交互。其语法如下:

subprocess.Popen(args, bufsize=-1, executable=None, stdin=None, stdout=None, stderr=None, preexec_fn=None, close_fds=True, shell=False, cwd=None, env=None, universal_newlines=None, startupinfo=None, creationflags=0, restore_signals=True, start_new_session=False, pass_fds=(), *, encoding=None, errors=None)

我们可以使用Popen对象的方法与子进程进行交互,如发送输入、读取输出等。

下面是一个例子:

import subprocess

p = subprocess.Popen(['echo', 'hello'], stdout=subprocess.PIPE)
out, err = p.communicate()
print(out.decode())

在这个例子中,我们使用Popen对象来执行echo命令,然后使用communicate()方法读取输出结果并将其打印到标准输出。

应用场景
执行系统命令

通过subprocess模块,我们可以在Python程序中执行系统命令。比如下面的例子可以查看当前目录下的文件列表:

import subprocess

result = subprocess.run('ls -l', shell=True, stdout=subprocess.PIPE)

print(result.stdout.decode())
执行外部程序

subprocess模块还可以帮助我们在Python程序中执行外部程序。比如下面的例子可以打开浏览器:

import subprocess

subprocess.Popen(['open', 'http://www.baidu.com'])
执行脚本文件

如果需要在Python程序中执行脚本文件,我们可以使用subprocess模块来实现。比如下面的例子可以执行一个Python脚本文件:

import subprocess

subprocess.Popen(['python', 'script.py'])
获得输出结果

我们可以使用subprocess模块来获取命令的输出结果。比如下面的例子可以获取ls命令的输出结果:

import subprocess

result = subprocess.run('ls -l', shell=True, stdout=subprocess.PIPE)

print(result.stdout.decode())
管道和重定向

subprocess模块还支持管道和重定向,可以将一个命令的输出作为另一个命令的输入。下面的例子中,我们把一段文本的输出作为grep命令的输入,然后把匹配的结果输出到标准输出:

import subprocess

text = 'hello world\nhello Python\nPython is awesome\n'
p1 = subprocess.Popen(['echo', text], stdout=subprocess.PIPE)
p2 = subprocess.Popen(['grep', 'Python'], stdin=p1.stdout, stdout=subprocess.PIPE)

output = p2.communicate()[0]
print(output.decode())
并发执行

subprocess模块还支持并发执行多个命令,可以提高程序执行效率。下面的例子中,我们执行了两个独立的命令并等待结果返回:

import subprocess

p1 = subprocess.Popen(['ls', '-l'], stdout=subprocess.PIPE)
p2 = subprocess.Popen(['du', '-sh', '.'], stdout=subprocess.PIPE)

output1, error1 = p1.communicate()
output2, error2 = p2.communicate()

print(output1.decode())
print(output2.decode())
控制子进程的输入输出

subprocess模块还支持控制子进程的输入输出,可以模拟人工输入和处理输出结果。下面的例子中,我们启动了一个Python解释器,并向其输入两行Python代码,然后读取输出结果:

import subprocess

p = subprocess.Popen(['python'], stdin=subprocess.PIPE, stdout=subprocess.PIPE)

p.stdin.write(b"print('hello world')\n")
p.stdin.write(b"print('hello Python')\n")
p.stdin.flush()

output, error = p.communicate()

print(output.decode())
总结

subprocess模块是Python中非常重要的一个标准库,可以帮助我们在Python程序中执行Shell命令、外部程序和脚本文件,并获取其输出结果。同时,它还支持管道、重定向、并发执行和控制子进程的输入输出等高级用法,可以满足各种复杂的应用场景。