Python
Python3

Pythonでシェルスクリプト②

はじめに

前回で、如何様にして基本的なファイル操作を行うかなどを扱いました。
今回は、さらに、プロセスや、時間について理解を深めできることを増やしましょう。

前回:Pythonでシェルスクリプト① - Qiita

システムとPythonの関係を深める

プログラムとプロセス

  1. 個別のプログラムを実行すると、OSはプロセスを1つ作る
  2. プロセスは、システムリソース(CPU、メモリ、ディスクスペース)とOSのカーネルのデータ構造(ファイル、ネットワーク接続、利用統計など)を使う。
  3. プロセスは、他のプロセスとは完全に独立する。

OSは全てのプロセスを管理しており、ここのプロセスに対して均等に時間を割り振る。

プロセスデータには、プログラム自身からもアクセスできる
これは面白い特徴ですよね。親、子の関係ではなく、ある種対等に近いんでしょうか。

  • os.getpid()
  • os.getcwd()

プロセスIDと、カレントディレクトリを取得する。

(O'Reilly Japan - 入門 Python 3、312ページから一部改変)

それでは、subprocessとは?

Pythonというプログラムから、他の既存のプログラムを起動、終了することができます。

sp.py
import subprocess as sp
a = sp.getoutput("date")
print(a)

multiprocessingによるプロセスの作成

Pythonの関数を、別個のプロセスとして実行できます。

mp.py
import multiprocessing as mp
import os

def do_this(what):
    whoami(what)

def whoami(what):
    print("Process %s says: %s" % (os.getpid(), what))

if __name__ == "__main__":
    whoami("I am the main program, king")
    for n in range(4):
        p = mp.Process(target=do_this, args=("%s" % (n)))
        p.start()

multiprocessingモジュールは、並行処理に大活躍します。

terminate()メソッドによるプロセスの強制終了

import multiprocessing
p = multiprocessing.Process(target=func, args=("char"))
p.terminate()

カレンダーとクロック

実務経験の少ない方や、僕のように、この世の全てを自由に生きている人間にとって、軽視しがちな日付や時刻ですが、シェルスクリプトには欠かせない要素の一つだと思います。

datetimeモジュール(標準ライブラリ)

このモジュールは、4個のメインオブジェクトを持ちます。
1. 年、月日を対象とするdate
2. 時分秒と端数を対象とするtime
3. 日付と時刻のdatetime
4. datetimeの間隔を対象とするtimedelta

時間という概念を、日付と時刻(datetime)と大きく捉えてから、それを二つに割った、dateとtimeと、重要な概念の間隔(timedelta)と捉えると一瞬で覚えられますね。

from datetime import date
new_year = date(2018, 1, 1)

# それぞれを、個別に取得
new_year.year
new_year.month
new_year.day

# 日時表現のISO 8601を用いて表示
new_year.isoformat()

プロパティもメソッド、至極単純でわかりやすい!
次は、今日の日付を自動で取得してオブジェクトを作ります。

from datetime import date
now = date.today()

次の例では、timedeltaオブジェクトを用いて、一日後、一日前など。
直感的なので、簡単ですね。

from datetime import date
from datetime import timedelta

now = date.today()
one_day = timedelta(days=1)

tomorrow = today + one_day
yesterday = today - one_day

一日の中の時間を表現するには、datetimeモジュールの、timeオブジェクトを用います。

from datetime import time
noon = time(12, 0, 0)

#  それぞれを、個別に取得
noon.minute
noon.second
noon.microsecond

最後に

今回は、プロセスとPythonの関係を見たあと、有用性の高い時間の扱い方について触れました。
次回は、引数をとったり、マニュアルを用意したりできればなと思います。

参考

O'Reilly Japan - 入門 Python 3