Python
 Computer >> コンピューター >  >> プログラミング >> Python

Pythonでサブプロセスモジュールを使用するにはどうすればよいですか?


プロセスを理解する-

Windows、MAC、またはLinuxでプログラムをコーディングして実行すると、オペレーティングシステムがプロセス(単一)を作成します。プロセスは、CPU、RAM、ディスクスペース、およびオペレーティングシステムのカーネルのデータ構造などのシステムリソースを使用します。プロセスは他のプロセスから分離されています。他のプロセスが実行していることや、プロセスに干渉していることを確認することはできません。

注: このコードは、システムのようなLinuxで実行する必要があります。 Windowsで実行すると、例外がスローされる場合があります。

オペレーティングシステムの目標-

OSの主な2つの目標は、プロセスの作業を公平に分散し、ユーザーに対応することです。これらは、実行中のすべてのプロセスを追跡し、それぞれに実行するための少しの時間を与えてから、別のプロセスに切り替えることによって達成されます。 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コマンドを実行し、情報をキャプチャします。次に、出力はパンダのデータフレームにキャプチャされ、さらに処理されます。

# 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

  1. PythonでTkinterを使用してタイトルバーを編集するにはどうすればよいですか?

    Tkinterは、プログラムの実行後に表示されるウィンドウまたはフレームを作成します。 Tkinterのすべての関数とモジュールは独立しているため、特定の関数を使用してウィンドウ属性をカスタマイズできます。 Tkinterは、すべてのアプリケーションに対してデフォルトのルートウィンドウを作成します。 Tkinterウィンドウのデフォルトのタイトルをカスタマイズまたは編集するには、次の方法を使用できます。 title(text= “your title”) Tkinterフレームのオブジェクトを開始してウィンドウを作成し、ウィンドウまたはフレームのタイトルを編集してみ

  2. Tkinter Pythonでスレッドを使用する方法は?

    Tkinterでは、スレッド化を使用して一度に複数の関数を呼び出すことができます 。アプリケーション内の一部の機能の非同期実行を提供します。 Pythonでスレッドを使用するために、スレッドというモジュールをインポートできます。 スレッドをサブクラス化します クラス。新しいクラス内で、実行を上書きする必要があります メソッドを実行し、そこでロジックを実行します。 したがって、基本的にスレッドを使用すると、一度に複数の作業を行うことができます。アプリケーションでスレッド化を実現するために、Tkinterは Thread()を提供します 機能。 例を挙げて、しばらくスリープしてから別の関数を