📅  最后修改于: 2023-12-03 15:06:53.504000             🧑  作者: Mango
在Python中,如果需要执行一些Shell命令,我们可以使用标准库中的subprocess模块来实现。subprocess模块可以让我们方便地在Python程序中执行外部命令,并获取其输出。
下面我们来介绍一些subprocess模块的常用方法和应用场景。
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.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(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命令、外部程序和脚本文件,并获取其输出结果。同时,它还支持管道、重定向、并发执行和控制子进程的输入输出等高级用法,可以满足各种复杂的应用场景。