python中shell执行知识点

1. shell 是什么

Shell 是指操作系统中用户与系统“内核”之间的接口。在计算机系统架构中,shell 是操作系统核心与用户之间的桥梁,为用户提供一个与内核通讯的界面,接收用户命令并交给操作系统内核完成。

1.1 shell 的分类

Unix 系统中有很多流行的 Shell,比如 bash,ksh,tcsh,zsh 等。而 Python 中则提供了多个模块可供调用执行 shell 命令,如 os、subprocess、commands 等。

2. Python 中执行基本 shell 命令

Python 中执行基本的 shell 命令可以通过 os 模块中的一些方法实现,其中一些常用的方法如下:

2.1 os.system

os.system 方法可以直接在 Python 程序中执行 shell 命令,在执行完毕后返回命令执行结果的状态值。

例如,执行 ls 命令可以使用 os.system('/bin/ls') 方法,代码如下:

import os

os.system('/bin/ls')

其中,/bin/ls 为要执行的 shell 命令。执行后,会将当前目录下的所有文件和文件夹列出来,如下:

file1.txt

file2.txt

folder1

folder2

2.2 os.popen

os.popen 方法可以在 Python 中执行一个 shell 命令,并返回命令运行结果的对象。返回值为一个文件对象,可以直接读取文件中的内容。

例如,执行 ps 命令可以使用 os.popen('ps -ef').read() 方法,代码如下:

import os

print(os.popen('ps -ef').read())

其中,ps -ef 为要执行的 shell 命令。执行后,会打印出系统中运行的所有进程信息,如下:

UID PID PPID C STIME TTY TIME CMD

root 1 0 0 2021 ? 00:02:11 /lib/systemd/systemd

root 2 0 0 2021 ? 00:00:01 [kthreadd]

root 3 2 0 2021 ? 00:00:00 [rcu_gp]

...

2.3 os.system 和 os.popen 的区别

os.popen 返回的对象是一个类文件对象,也就是说我们可以使用类文件对象的方法读取或写入数据。而 os.system 最多只是能够返回命令执行的结果状态,无法获取到 shell 命令的输出信息。

例如,我们要执行一个查询方式为 count 的 MySQL 查询,可以使用 os.popen() 方法直接获取返回结果:

import os

result = os.popen("mysql -u -p -h -P -D -se 'select count(*) from

'").read()

print(result)

而如果使用 os.system() 的话,由于无法获取到命令执行的输出信息,我们则需要将查询结果写入文件,再打开文件读取。

os.system("mysql -u -p -h -P -D -se 'select count(*) from

' > result.txt")

with open('result.txt', 'r') as f:

result = f.read()

print(result)

2.4 subprocess.call

subprocess.call 可以执行 shell 命令,并等待命令执行完毕之后返回命令执行状态。相比 os.system,subprocess.call 成功地创建一个新进程来执行命令,与原始 Python 进程相互独立,因此允许在另一个 shell 会话中运行命令,也提供了更多的控制。

例如,执行 ls 命令可以使用 subprocess.call(['/bin/ls', "-l"]) 方法,代码如下:

import subprocess

subprocess.call(['/bin/ls', "-l"])

其中,/bin/ls 和 -l 为要执行的 shell 命令和命令参数。执行后,会将当前目录下的所有文件和文件夹列出来,并显示详细信息,如下:

-rw-rw-r-- 1 user user 1407 Sep 20 10:48 file1.txt

-rw-rw-r-- 1 user user 448 Sep 20 10:48 file2.txt

drwxrwxr-x 2 user user 4096 Sep 20 10:48 folder1

drwxrwxr-x 2 user user 4096 Sep 20 10:48 folder2

3. Python 中执行高级 shell 命令

以上的方法是 Python 中执行一些基础命令的方法,而对于一些较为复杂的命令,则需要使用 subprocess 模块中的 Popen 方法。

3.1 subprocess.Popen

subprocess.Popen 方法可以执行更复杂的 shell 命令,并提供更高级的控制。它允许我们从命令的标准输出和标准错误流中获取内容,并且可以启动和停止进程。

例如,执行 ping 命令可以使用以下代码来执行:

import subprocess

ping_process = subprocess.Popen(

["ping", "-c", "4", "www.baidu.com"],

stdout=subprocess.PIPE,

stderr=subprocess.PIPE

)

output, error = ping_process.communicate()

print(output.decode('utf-8'))

其中,"ping", "-c", "4", "www.baidu.com" 为要执行的 shell 命令和命令参数。stdout 和 stderr 参数用于指定执行结果和错误内容的输出方式。执行完毕后,会输出命令执行的结果,如下:

PING www.a.shifen.com (14.215.177.39) 56(84) bytes of data.

64 bytes from 14.215.177.39 (14.215.177.39): icmp_seq=1 ttl=59 time=7.25 ms

64 bytes from 14.215.177.39 (14.215.177.39): icmp_seq=2 ttl=59 time=3.89 ms

64 bytes from 14.215.177.39 (14.215.177.39): icmp_seq=3 ttl=59 time=5.22 ms

64 bytes from 14.215.177.39 (14.215.177.39): icmp_seq=4 ttl=59 time=4.32 ms

--- www.a.shifen.com ping statistics ---

4 packets transmitted, 4 received, 0% packet loss, time 3003ms

rtt min/avg/max/mdev = 3.895/5.172/7.250/1.329 ms

以上就是 Python 中执行 shell 命令的基本方式和高级方式的介绍,我们可以在需要时选择不同的方法来执行不同的 shell 命令,方便快捷地进行自动化操作。