如何用Python执行Shell命令

Python为不同的操作系统相关操作提供了许多模块。运行外部命令或shell命令是非常流行的Python开发人员。我们可以从python代码或脚本调用Linux或Windows命令并使用输出。

null

导入操作系统模块

我们可以用 system() 函数以在Linux和Windows操作系统中运行shell命令。 system() 由提供 os 模块。所以我们将像下面这样加载这个模块。

import os

带系统功能的运行命令

装载后 os 我们可以使用的模块 system() 通过提供要运行的外部命令来运行。在本例中,我们将运行 ls 列出当前工作目录内容的命令。

import osos.system('ls')
Run Command with system Function
带系统功能的运行命令

导入子流程模块

运行外部shell命令的另一种方法是 subprocess 模块。本模块提供与流程相关的功能。我们将使用 call() 但是首先,我们需要加载 subprocess 模块。

import subprocess

使用调用函数运行命令

我们将使用 call() 函数,它将创建一个单独的进程并在此进程中运行提供的命令。在本例中,我们将为 ls 命令。我们应该提供要调用的二进制文件的确切路径。

import subprocesssubprocess.call("/bin/ls")
Run Command with call Function
使用调用函数运行命令

为命令提供参数

我们可能需要为我们将调用的命令提供参数。我们将提供一个列表,其中这个列表包括我们将调用的命令或二进制文件以及作为列表项的参数。在本例中,我们将调用 ls 对于路径 /etc/ -l 参数。

subprocess.call(['/bin/ls','-l','/etc'])
Provide Parameters To The Command
为命令提供参数

将命令输出保存到变量

我们可能需要将命令输出保存到变量或文件中。我们将把输出变量命名为 o 就像下面一样。我们将使用 read() 的功能 popen() 返回的对象。read()将以单个字符串的形式提供整个输出。

o=os.popen('ls').read()print(o)
Save Command Output To A Variable
将命令输出保存到变量

逐行保存命令输出

执行某些命令可以创建许多由多行组成的输出。或者,我们可以使用 readlines() 功能。另外,我们可以迭代readlines()函数来逐行读取输出。下面我们将执行 ls 产生多行输出的命令。然后我们将访问保存到 lines 以数组或列表的方式。

import oslines = os.popen('ls').readlines()print(lines[0])#aiohttp-2.3.10-cp36-cp36m-manylinux1_x86_64.whlprint(lines[1])#aiohttp_cors-0.5.3-py3-none-any.whlprint(lines[2])#allclasses.htmlprint(lines[3])#allclasses-index.htmlprint(lines[4])#allpackages-index.htmlprint(lines[5])#a.out
Save Command Output Line By Line
逐行保存命令输出

指定标准输入、输出、错误管道/变量

默认情况下,已执行命令的输出通过Popen()函数以字符串形式返回。或者,我们可以指定管道或变量来存储已执行命令的输入和输出管道。在下面的示例中,我们将使用 stdout stderr 用于存储标准输出和标准错误的变量。函数将创建一个实例,其中 communicate() 函数将返回标准输出和标准误差。这对于需要交互输出的长时间运行的命令非常有用。

import subprocessc = subprocess.Popen(['ls','-l','.'], stdout = subprocess.PIPE, stderr = subprocess.PIPE)stdout, stderr = c.communicate()print(stdout)print(stderr)
Specify the Standard Input, Output, Error Pipe/Variables
指定标准输入、输出、错误管道/变量

os.system()vs subprocess.run()vs subprocess.Popen()

正如我们所看到的,Python提供了很多函数来运行和执行系统命令。但它们在使用过程中存在一些差异,提供了不同的功能。下面我们将比较和解释这些命令的异同。

相关文章: Python子进程和Popen()及其示例

os.system() vs subprocess.run() vs subprocess.Popen()
os.system()vs subprocess.run()vs subprocess.Popen()
  • 如果我们需要解析的参数,os.system()函数不能使用,但是subprocess.run()和subprocess.Popen()可以很容易地使用。
  • 如果在执行命令时需要与标准输入和标准输出进行通信,我们应该使用subprocess.Popen()和subprocess.run()函数。

一般来说,我们可以看到os.system()函数提供了非常基本和实用的用法,其中subprocess.run()和subprocess.Popen()提供了更高级的特性用法。

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享