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 命令,方便快捷地进行自动化操作。
相关阅读
后端开发标签
Python热门