Computer >> 컴퓨터 >  >> 프로그램 작성 >> Python

Python에서 Subprocess 모듈을 사용하는 방법은 무엇입니까?

<시간/>

과정 이해 -

Windows, MAC 또는 Linux에서 프로그램을 코딩하고 실행할 때 운영 체제는 프로세스(단일)를 생성합니다. 운영 체제는 CPU, RAM, 디스크 공간 및 운영 체제 커널의 데이터 구조와 같은 시스템 리소스를 사용합니다. 프로세스는 다른 프로세스와 격리되어 다른 프로세스가 수행하는 작업을 확인하거나 방해할 수 없습니다.

참고: 이 코드는 시스템과 같은 Linux에서 실행되어야 합니다. Windows에서 실행하면 예외가 발생할 수 있습니다.

운영 체제의 목표 -

OS의 주요 두 가지 목표는 프로세스 작업을 공정하게 확산하고 사용자에게 응답하는 것입니다. 이는 실행 중인 모든 프로세스를 추적하여 각각 실행에 약간의 시간을 주고 다른 프로세스로 전환함으로써 달성됩니다. Windows 기반 컴퓨터의 작업 관리자, Mac의 Activity Monitor(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 문서에서는 시스템 명령에 액세스하기 위한 하위 프로세스 모듈을 권장합니다.

하위 프로세스 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...

하위 프로세스로 더 자세한 출력을 얻으려면 아래 코드를 참조하십시오.

예시

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