Python为不同的操作系统相关操作提供了许多模块。运行外部命令或shell命令是非常流行的Python开发人员。我们可以从python代码或脚本调用Linux或Windows命令并使用输出。
导入操作系统模块
我们可以用 system()
函数以在Linux和Windows操作系统中运行shell命令。 system()
由提供 os
模块。所以我们将像下面这样加载这个模块。
import os
带系统功能的运行命令
装载后 os
我们可以使用的模块 system()
通过提供要运行的外部命令来运行。在本例中,我们将运行 ls
列出当前工作目录内容的命令。
import osos.system('ls')

导入子流程模块
运行外部shell命令的另一种方法是 subprocess
模块。本模块提供与流程相关的功能。我们将使用 call()
但是首先,我们需要加载 subprocess
模块。
import subprocess
使用调用函数运行命令
我们将使用 call()
函数,它将创建一个单独的进程并在此进程中运行提供的命令。在本例中,我们将为 ls
命令。我们应该提供要调用的二进制文件的确切路径。
import subprocesssubprocess.call("/bin/ls")

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

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

逐行保存命令输出
执行某些命令可以创建许多由多行组成的输出。或者,我们可以使用 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

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

os.system()vs subprocess.run()vs subprocess.Popen()
正如我们所看到的,Python提供了很多函数来运行和执行系统命令。但它们在使用过程中存在一些差异,提供了不同的功能。下面我们将比较和解释这些命令的异同。
相关文章: Python子进程和Popen()及其示例

- 如果我们需要解析的参数,os.system()函数不能使用,但是subprocess.run()和subprocess.Popen()可以很容易地使用。
- 如果在执行命令时需要与标准输入和标准输出进行通信,我们应该使用subprocess.Popen()和subprocess.run()函数。
一般来说,我们可以看到os.system()函数提供了非常基本和实用的用法,其中subprocess.run()和subprocess.Popen()提供了更高级的特性用法。