如何在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

更新於:2020年11月9日

1K+ 次瀏覽

啟動你的職業生涯

透過完成課程獲得認證

開始
廣告