Computer >> Máy Tính >  >> Lập trình >> Python

Làm thế nào để sử dụng Mô-đun quy trình con trong Python?

Quá trình hiểu -

Khi bạn viết mã và thực thi một chương trình trên Windows, MAC hoặc Linux, Hệ điều hành của bạn sẽ tạo một quy trình (đơn). Quá trình này sử dụng tài nguyên hệ thống như CPU, RAM, Dung lượng đĩa và cả cấu trúc dữ liệu trong nhân của hệ điều hành. Một quy trình được tách biệt với các quy trình khác — quy trình này không thể nhìn thấy những quy trình khác đang làm gì hoặc can thiệp vào chúng.

Lưu ý: Mã này phải được chạy trên Linux giống như sytems. Khi được thực thi trên windows có thể tạo ra các ngoại lệ.

Mục tiêu của Hệ điều hành -

Mục tiêu kép chính của OS là truyền bá công việc của quy trình một cách công bằng và đáp ứng cho người dùng. Chúng được thực hiện bằng cách theo dõi tất cả các quá trình đang chạy, cho mỗi quá trình một chút thời gian để chạy và sau đó chuyển sang một quá trình khác. Bạn có thể xem trạng thái của các quy trình của mình bằng giao diện đồ họa như Trình quản lý tác vụ trên máy tính chạy Windows, Trình theo dõi hoạt động của máy Mac (macOS) hoặc lệnh hàng đầu trong Linux.

Là một lập trình viên, chúng ta có thể truy cập dữ liệu quy trình từ chương trình của chính mình. Nhưng bằng cách nào? Đơn giản bằng cách sử dụng mô-đun hệ điều hành thư viện tiêu chuẩn. Tôi sẽ chỉ cho bạn một vài ví dụ.

# 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()}")

Việc chạy và tạo ra một quy trình hệ thống mới có thể khá hữu ích cho các nhà phát triển và quản trị viên hệ thống, những người muốn tự động hóa các tác vụ cụ thể của hệ điều hành.

Python có một mô-đun quy trình con, mô-đun này có thể quay một quy trình mới, gửi và nhận thông tin từ các quy trình, đồng thời xử lý các mã lỗi và trả về.

Tài liệu Python chính thức đề xuất mô-đun quy trình con để truy cập các lệnh hệ thống.

Hàm call () của quy trình con đợi lệnh được gọi kết thúc việc đọc đầu ra. Chúng ta sẽ xem một số ví dụ dưới đây để trích xuất thông tin về dung lượng ổ đĩa của hệ thống.

Đoạn mã dưới đây sẽ thực hiện lệnh df -h và nắm bắt thông tin. Sau đó, đầu ra được ghi lại vào khung dữ liệu gấu trúc để xử lý thêm.

Ví dụ

# 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)

Đầu ra

Đối tượng
<_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...

Để có đầu ra chi tiết hơn với quy trình con, hãy xem mã bên dưới.

Ví dụ

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()

Đầu ra

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