IT・技術研修ならCTC教育サービス

サイト内検索 企業情報 サイトマップ

研修コース検索

コラム

Pythonでネットワーク自動化をしよう

CTC 教育サービス

 [IT研修]注目キーワード   Python  UiPath(RPA)  最新技術動向  Microsoft Azure  Docker  Kubernetes 

第16回 subprocessライブラリ(1)run()関数 (小澤昌樹) 2023年11月

1. はじめに

みなさん、こんにちは。

前回のコラムで、ネットワーク自動化に使えそうなPythonのモジュールやライブラリを紹介しました。今回からは、その中からsubprocessライブラリに焦点を当て、詳しく解説していきます。

2. subprocessライブラリ

subprocessライブラリは、Pythonの標準ライブラリで、Pythonから他のプログラムやコマンドを実行するためのモジュールです。例えば、コンピュータ内に保存されているファイルのリストを表示するコマンドや、特定のファイルを開くプログラムなどを、Pythonから直接呼び出して実行することができます。このライブラリを使うと、Pythonから他のプログラムへと簡単に連携することができるので、さまざまなタスクを効率的に実行することができます。

例えば、コンピュータ内に保存されているファイルのリストを表示するコマンドを実行するには、以下のようにします。

  1. LinuxやmacOSの場合
    コマンドは ls です。特定のディレクトリの中身を見たい場合は、例えば ls /path/to/directory のように使用します。Pythonから実行する場合は、以下のようにします。

    
    import subprocess
    
    completed_process = subprocess.run([’ls’, ’/path/to/directory’], capture_output=True, text=True) print(completed_process.stdout)
  2. Windowsの場合
    コマンドは dir です。特定のディレクトリの中を見たい場合は、例えば、dir C:¥path¥to¥directory のように使用します。Pythonからの実行例も見てみましょう。Windowsの場合、shell=True を指定してコマンドを発行します。これにより、Windowsのコマンドプロンプトを介してコマンドが実行されるようになります。

    
    import subprocess
    
    completed_process = subprocess.run([’dir’, ’C:¥path¥to¥directory’], capture_output=True, text=True, shell=True) print(completed_process.stdout)
3. subprocess.run()

新しいプロセスを起動して外部コマンドを実行し、その終了まで待つような処理を実行するには、subprocess.run() 関数を使用します。この関数を使うと、システムのシェルコマンドや他の外部プログラムを簡単に実行することができます。

第一引数

subprocess.run() の第一引数は、実行するコマンドとその引数を含むリストまたは文字列です。

  1. リストで与える
    コマンドとその引数を個別の文字列としてリストに格納します。これは最も一般的な使用法で、リストとして引数を指定すると、シェルの特殊文字が誤って解釈されるリスクも低減します。

    
    result = subprocess.run([’ls’, ’-l’, ’/path/to/directory’])
    
  2. 文字列で与える
    一連のコマンドと引数を単一の文字列として、引数とする方法です。この場合、shell=True 引数が必要となり、コマンドがシェル経由で実行されることを意味します。ただし、この方法は、外部からのデータを含むコマンドを実行する場合にセキュリティリスクが伴うため、注意が必要です。

    
    result = subprocess.run(’ls -l /path/to/directory’, shell=True)
    
戻り値

subprocess.run() は、CompletedProcess インスタンスを返します。このインスタンスは、以下のような属性を持ちます。

  • returncode: プロセスの終了コード(0:成功)
  • stdout: コマンドの標準出力(実行結果を見ることができます)
  • stderr: コマンドの標準エラー出力
引数オプション

subprocess.run() は多くの引数オプションを持っており、これらのオプションを使うと外部コマンドの実行の挙動をカスタマイズすることができます。

  1. stdin

  2. プロセスの標準入力へのソースを指定します。subprocess.PIPE などの特殊な値や既存のファイルオブジェクトを使用できます。

  3. stdout
    プロセスの標準出力先を指定します。

  4. stderr
    プロセスの標準エラー出力先を指定します。

  5. capture_output=True
    コマンドの標準出力と標準エラー出力をキャプチャすることができます。stdoutとstderrをキャプチャするためにsubprocess.PIPE が自動的に使われます。

  6. text=True
    出力をバイト列ではなく文字列として取得します。デフォルトでは、subprocess は出力をバイト列として返しますが、text=True を指定することで、人間が読みやすいテキスト形式で出力を取得することができます。

  7. timeout
    コマンドの最大実行時間を秒単位で指定します。この時間を超えると、プロセスは中止されます。

  8. check=True
    非ゼロの終了コードでコマンドが終了した場合に、CalledProcessError例外を発生させることができます。

4. pingを実行

以下のコードは、google.com に対して ping コマンドを実行し、その結果を表示するものです。


import subprocess

# ’ping’ コマンドを実行するための引数をリストとして指定 args = [’ping’, ’google.com’, ’-c’, ’4’] # ’-c 4’ はpingを4回
# subprocess.run を使用してコマンドを実行 result = subprocess.run(args, capture_output=True, text=True)
# 実行結果を表示 print(result.stdout)

実行結果は以下のようになります。


PING [google.com](<http://google.com/>) (172.xxx.xxx.110): 56 data bytes
64 bytes from 172.xxx.xxx.110: icmp_seq=0 ttl=58 time=38.181 ms
64 bytes from 172.xxx.xxx.110: icmp_seq=1 ttl=58 time=22.222 ms
64 bytes from 172.xxx.xxx.110: icmp_seq=2 ttl=58 time=13.820 ms
64 bytes from 172.xxx.xxx.110: icmp_seq=3 ttl=58 time=14.963 ms

--- google.com ping statistics --- 4 packets transmitted, 4 packets received, 0.0% packet loss round-trip min/avg/max/stddev = 13.820/22.296/38.181/9.721 ms
5. まとめ

今回は、subprocessライブラリのrun()関数に焦点を当てて解説しました。この関数を使うと、外部のプログラムやコマンドを簡単に実行できます。次回は、subprocessライブラリを使って非同期処理で複数のプロセスを同時に実行する方法を紹介します。次回もお楽しみに。

 


 

 [IT研修]注目キーワード   Python  UiPath(RPA)  最新技術動向  Microsoft Azure  Docker  Kubernetes