如何在Python中使用子程序模組?
理解程序 -
當你在Windows、MAC或Linux上編寫並執行程式時,你的作業系統會建立一個(單個)程序。它使用系統資源,例如CPU、RAM、磁碟空間以及作業系統核心中的資料結構。一個程序與其他程序隔離——它無法看到其他程序正在做什麼或干擾它們。
注意:此程式碼必須在類似Linux的系統上執行。在Windows上執行可能會丟擲異常。
作業系統的目標 -
作業系統的兩個主要目標是公平地分配程序的工作並對使用者做出響應。這是透過跟蹤所有正在執行的程序、讓每個程序執行一小段時間然後切換到另一個程序來實現的。你可以使用圖形介面(例如Windows計算機上的任務管理器、Mac的活動監視器(macOS)或Linux中的top命令)檢視程序的狀態。
作為程式設計師,我們可以從自己的程式訪問程序資料。但是如何做到呢?只需使用標準庫OS模組即可。我將向你展示幾個示例。
# This script works only on linux/unix import os print(f" *** Process ID - {os.getpid()}") print(f" *** My User ID - {os.getuid()} and My Group ID - {os.getgid()} ") print(f" *** Current Working Directory is - {os.getcwd()}")
執行和啟動新的系統程序對於希望自動化特定作業系統任務的開發人員和系統管理員非常有用。
Python有一個子程序模組,它可以啟動新的程序,從程序傳送和接收資訊,以及處理錯誤和返回碼。
官方Python文件建議使用子程序模組來訪問系統命令。
subprocess 的call()函式等待呼叫的命令完成讀取輸出。我們將在下面的幾個示例中看到如何提取系統的磁碟空間資訊。
以下程式碼將執行df -h命令並捕獲資訊。然後將輸出捕獲到pandas資料框中以進行進一步處理。
示例
# 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...
要獲得更詳細的subprocess輸出,請參見以下程式碼。
示例
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
廣告