如何在Python中使用Subprocess模块?
更多Python相关文章,请阅读:Python 教程
理解进程 –
当您在Windows、MAC或Linux上编写和执行程序时,您的操作系统会创建一个进程(单个进程)。它使用系统资源,例如CPU、RAM、磁盘空间以及操作系统内核中的数据结构。进程与其他进程隔离 – 它无法看到其他进程正在做什么,也无法干扰它们。
注意: 此代码必须在类似Linux的系统上运行。在Windows上执行可能会抛出异常。
操作系统的目标 –
操作系统的主要双重目标是公平地分配进程的工作,并对用户响应。这些是通过跟踪所有正在运行的进程,给每个进程一点时间运行,然后切换到另一个进程来实现的。您可以使用诸如Windows计算机上的任务管理器、Mac的Activity Monitor(macOS)或Linux上的top命令等图形界面查看进程的状态。
作为程序员,我们可以从自己的程序访问进程数据。但如何实现呢?只需使用标准库OS模块即可。我将展示几个示例。
#此脚本仅在linux / unix上运行
import os
print(f“***Process ID- {os.getpid()}”)
print(f“***My User ID- {os.getuid()}和My Group ID- {os.getgid()}”)
print(f“***当前工作目录为- {os.getcwd()}”)
运行和启动新系统进程对于希望自动化特定操作系统任务的开发人员和系统管理员非常有用。
Python具有子进程模块,可以旋转新进程,发送和接收进程的信息,并处理错误和返回代码。
官方的Python文档建议使用子进程模块来访问系统命令。
子进程调用()函数等待所调用的命令完成读取输出。我们将在下面看到几个示例,以提取系统磁盘空间信息。
以下代码将执行“df -h”命令并捕获信息。然后将输出捕获到pandas dataframe以进行进一步处理。
例子
# python code to create a subprocess for extracting disk space on linux using df -h
from io import StringIO
import pandas as pd
import subprocess
import ast
diskspace = "df"
diskspace_arg = "-h"
sp = subprocess.Popen([diskspace,diskspace_arg], stdout=subprocess.PIPE)
b = StringIO(sp.communicate()[0].decode('utf-8'))
df = pd.read_csv(b, sep=",")
print(df)
输出
<_ io.StringIO object at 0x7ff67ef52798>
Filesystem Size Used Avail Use% Mounted on
0 devtmpfs 7.8G 0 7.8G 0%/ dev
1 tmpfs 7.8G 0 7.8G 0%/ dev / shm
2 tmpfs 7.8G 33M 7.8G 1%/ run
3 tmpfs 7.8G 0 7.8G 0%/ sys / fs / ...
4 /dev / xvda2 20G 16G 4.3G 79% /
5 /dev / xvdb 246G 16G 218G 7% / tdm
6 tmpfs 1.6G 0 1.6G 0%/ run / use ...
要获取更详细的子进程输出,请参见下面的代码。
例子
from io import StringIO
import pandas as pd
import subprocess
def uname_func():
uname =“uname”
uname_arg =“-a”
user_info = subprocess.call([uname,uname_arg])
return user_info
def disk_func():
diskspace =“pydf”
diskspace_arg =“-a”
discinfo_df = diskspace
stdout = subprocess.check_output([diskspace,diskspace_arg])
return stdout
def main():
userinfo = uname_func()
discinfo = disk_func()
print(“Displaying values now ...”)
#print(stdout.decode('utf-8'))
print(discinfo.decode('utf-8'))
print(type(discinfo.decode('utf-8')))
content = discinfo.decode('utf-8').split(“\n”)
print(content)
main()
输出
Linux ip-00-000-00-000.xxxx.xxxx.xx.xx 0.00.0-000.el7.x86_64 #1 SMP Tue Aug 18 14:50:17 EDT 2020 x86_64 x86_64 x86_64 GNU/Linux
Displaying values now...
Filesystem Size Used Avail Use% Mounted on
/dev/xvda2 20G 16G 4318M 78.9 [#####.] /
devtmpfs 7918M 0 7918M 0.0 [......] /dev
hugetlbfs 0 0 0 - [......] /dev/hugepages
mqueue 0 0 0 - [......] /dev/mqueue
devpts 0 0 0 - [......] /dev/pts
tmpfs 7942M 0 7942M 0.0 [......] /dev/shm
proc 0 0 0 - [......] /proc
binfmt_misc 0 0 0 - [......] /proc/sys/fs/binfmt_misc
tmpfs 7942M 32M 7909M 0.4 [......] /run
tmpfs 1588M 0 1588M 0.0 [......] /run/user/1000
sysfs 0 0 0 - [......] /sys
tmpfs 7942M 0 7942M 0.0 [......] /sys/fs/cgroup
cgroup 0 0 0 - [......] /sys/fs/cgroup/blkio
cgroup 0 0 0 - [......] /sys/fs/cgroup/cpu,cpuacct
cgroup 0 0 0 - [......] /sys/fs/cgroup/cpuset
cgroup 0 0 0 - [......] /sys/fs/cgroup/devices
cgroup 0 0 0 - [......] /sys/fs/cgroup/freezer
cgroup 0 0 0 - [......] /sys/fs/cgroup/hugetlb
cgroup 0 0 0 - [......] /sys/fs/cgroup/memory
cgroup 0 0 0 - [......] /sys/fs/cgroup/net_cls,net_prio
cgroup 0 0 0 - [......] /sys/fs/cgroup/perf_event
cgroup 0 0 0 - [......] /sys/fs/cgroup/pids
cgroup 0 0 0 - [......] /sys/fs/cgroup/systemd
pstore 0 0 0 - [......] /sys/fs/pstore
configfs 0 0 0 - [......] /sys/kernel/config
debugfs 0 0 0 - [......] /sys/kernel/debug
securityfs 0 0 0 - [......] /sys/kernel/security
/dev/xvdb 246G 16G 218G 6.4 [......] /tdm
极客教程