Python-システム相互作用サブプロセス

目次

1つ、OSおよびコマンドモジュール

1. os.system()関数の例

2. os.popen()関数の例

3.commands.getstatusoutput()関数の例

2、サブプロセスモジュール

1.サブプロセスモジュールの一般的な機能

2.上記の関数の定義とパラメータの説明

3.subprocess.CompletedProcessクラスの概要

4.例

3、サブプロセス。Popenの紹介

1.subprocess.Popenのコンストラクター

2.subprocess.Popenクラスのインスタンスから呼び出すことができるメソッド

3.subprocess.Popenの使用例

4、まとめ


Linuxプラットフォームのシェルなど、ほとんどすべてのオペレーティングシステムでコマンドライン命令を使用してオペレーティングシステムと対話できます。では、Pythonを使用してこれらのコマンドライン命令の実行を完了するにはどうすればよいでしょうか。さらに、知っておくべきことは、コマンドライン命令の実行には通常、次の2つの結果があります。

  1. コマンド実行のステータスコード-コマンド実行が成功したかどうかを示します
  2. コマンド実行の出力結果-コマンドが正常に実行された後の出力

Pythonの初期バージョンでは、主にos.system()、os.popen()。read()などの関数を使用してコマンドライン命令を実行していましたが、ほとんど使用されないコマンドモジュールもあります。ただし、Python 2.4以降の公式ドキュメントではサブプロセスモジュールが推奨されているため、osモジュールとコマンドモジュールの関連関数は、簡単な使用例としてここでのみ提供されています。ここで紹介したい重要なことは、サブプロセスモジュールです。 。

1つ、OSおよびコマンドモジュール


Pythonには、コマンドライン命令の実行を完了するのに役立つ次の関数が用意されています。

関数名 説明
os.system(コマンド) コマンド実行状態コードを返し、コマンド実行結果を画面に出力します。
os.popen(command).read() コマンド実行結果は取得できますが、コマンド実行ステータスコードは取得できません。
コマンド.getstatusoutput(コマンド) タプル(コマンド実行ステータスコード、コマンド実行結果)を返します。これは、Python 2.7にのみ存在し、Windowsプラットフォームをサポートしていません。

説明:

  1. os.popen(command)関数はファイルオブジェクトを取得するため、read()メソッドに加えて、コマンドに応じてwrite()およびその他のメソッドもサポートします。
  2. コマンドモジュールはPython2.7にのみ存在し、Windowsプラットフォームをサポートしていないため、コマンドモジュールが使用されることはめったにありません。さらに、コマンドモジュールは、実際にはos.popen()をカプセル化することで完成します。

1. os.system()関数の例

>>> import os
>>>
>>> retcode = os.system('dir')
 驱动器 C 中的卷没有标签。
 卷的序列号是 4C32-B292

 C:\Users\wader\PycharmProjects\LearnPython 的目录

2017/03/21  11:15    <DIR>          .
2017/03/21  11:15    <DIR>          ..
2017/07/29  18:04    <DIR>          .idea
2016/12/06  11:19    <DIR>          blog
2016/12/06  11:42    <DIR>          day01
2016/12/09  22:07    <DIR>          day02
2017/01/04  09:14    <DIR>          day03
2017/07/19  16:11    <DIR>          day04
2017/07/29  14:44    <DIR>          day05
2017/07/06  14:45    <DIR>          day06
2017/07/06  17:13    <DIR>          exam01
               0 个文件              0 字节
              11 个目录  6,659,977,216 可用字节
>>> retcode
0
>>>

2. os.popen()関数の例

>>> import os
>>>
>>> ret = os.popen('dir').read()
>>> print(ret)
 驱动器 C 中的卷没有标签。
 卷的序列号是 4C32-B292

 C:\Users\wader\PycharmProjects\LearnPython 的目录

2017/03/21  11:15    <DIR>          .
2017/03/21  11:15    <DIR>          ..
2017/07/29  18:04    <DIR>          .idea
2016/12/06  11:19    <DIR>          blog
2016/12/06  11:42    <DIR>          day01
2016/12/09  22:07    <DIR>          day02
2017/01/04  09:14    <DIR>          day03
2017/07/19  16:11    <DIR>          day04
2017/07/29  14:44    <DIR>          day05
2017/07/06  14:45    <DIR>          day06
2017/07/06  17:13    <DIR>          exam01
               0 个文件              0 字节
              11 个目录  6,664,052,736 可用字节

>>>

3.commands.getstatusoutput()関数の例

コマンドモジュールはWindowsプラットフォームをサポートしていないため、この例はLinuxプラットフォームで実行されることに注意してください。

>>> import os
>>> os.system('ls')
cmdline-jmxclient-0.10.3.jar  dhparam.pem  FtpMan.class  gitlab.crt  gitlab.csr  gitlab.key  resolv.txt  test.json  test.php  test.sh  test.text  test.txt
0
>>> import commands
>>> retcode, ret = commands.getstatusoutput('ls -l')
>>> retcode
0
>>> print(ret)
total 68
-rw-r--r-- 1 root root 20124 Jul 11  2016 cmdline-jmxclient-0.10.3.jar
-rw-r--r-- 1 root root   424 Aug 22  2016 dhparam.pem
-rw-r--r-- 1 root root  2576 Jul 13  2016 FtpMan.class
-rw-r--r-- 1 root root  1302 Aug 22  2016 gitlab.crt
-rw-r--r-- 1 root root  1054 Aug 22  2016 gitlab.csr
-rw-r--r-- 1 root root  1675 Aug 22  2016 gitlab.key
-rw-r--r-- 1 root root  9329 Jun 24  2016 resolv.txt
-rw-r--r-- 1 root root   594 Mar  7 08:14 test.json
-rw-r--r-- 1 root root   162 Jun 28 10:39 test.php
-rw-r--r-- 1 root root   760 Jun 24  2016 test.sh
-r-x------ 1 root root     0 Feb  6 08:21 test.text
drwxr-xr-x 2 root root  4096 Feb  7 16:43 test.txt
>>> 

コマンドモジュールによって提供される属性を見ると、以下に示すように、コマンド実行のステータスコードと実行結果を取得するための別個の関数も提供されていることがわかります。

>>> dir(commands)
['__all__', '__builtins__', '__doc__', '__file__', '__name__', '__package__', 'getoutput', 'getstatus', 'getstatusoutput', 'mk2arg', 'mkarg']

2、サブプロセスモジュール


サブプロセスはPython2.4の新しいモジュールであり、新しいプロセスを生成し、それらの入力/出力/エラーパイプラインに接続し、それらのリターン(ステータス)コードを取得できます。このモジュールの目的は、次のようないくつかの古いモジュールとメソッドを置き換えることです。

  • os.system
  • os.spawn *

1.サブプロセスモジュールの一般的な機能

関数 説明
subprocess.run() Python3.5で追加された関数。指定されたコマンドを実行し、コマンドの実行が完了するのを待って、実行結果を含むCompletedProcessクラスのインスタンスを返します
subprocess.call() 指定されたコマンドを実行しコマンド実行ステータスコードを返します。その機能はos.system(cmd)と同様です。
subprocess.check_call() Python2.5で追加された関数。指定されたコマンドを実行し、実行が成功した場合はステータスコード返し、それ以外の場合は例外をスローしますその関数はsubprocess.run(...、check = True)と同等です。
subprocess.check_output() Python2.7で追加された関数。指定されたコマンドを実行します。実行ステータスコードが0の場合、コマンドの実行結果返さます。それ以外の場合は、例外がスローされます。
subprocess.getoutput(cmd) 文字列形式でコマンドを受け取り、コマンドを実行して実行結果返します。その機能はos.popen(cmd).read()およびcommands.getoutput(cmd)に似ています。
subprocess.getstatusoutput(cmd) cmdコマンドを実行し、タプル(コマンド実行ステータス、コマンド実行結果出力)返します。その関数はcommands.getstatusoutput()に似ています。

説明:

  1. Python 3.5以降のバージョンでは、公式ドキュメントでは、サブプロセスモジュールの関数を使用するために、他の関数の代わりにsubprocess.run()関数を推奨しています。
  2. Python 3.5より前のバージョンでは、subprocess.call()、subprocess.getoutput()、および上記の他の関数を介してサブプロセスモジュールの関数を使用できます。
  3. subprocess.run()、subprocess.call()、subprocess.check_call()、subprocess.check_output()はすべて、subprocess.Popenをカプセル化することで実装される高度な関数です。したがって、より複雑な関数が必要な場合は、subprocess.Popenを使用して完了できます。 。
  4. subprocess.getoutput()関数とsubprocess.getstatusoutput()関数は、Python2.xのコマンドモジュールの2つのレガシー関数です。これらは暗黙的にシステムシェルを呼び出し、他の関数のセキュリティと例外処理の一貫性を保証するものではありません。さらに、Python 3.3.4以降、Windowsプラットフォームのみをサポートしています。

2.上記の関数の定義とパラメータの説明

機能パラメータリスト:

subprocess.run(args, *, stdin=None, input=None, stdout=None, stderr=None, shell=False, timeout=None, check=False, universal_newlines=False)

subprocess.call(args, *, stdin=None, stdout=None, stderr=None, shell=False, timeout=None)

subprocess.check_call(args, *, stdin=None, stdout=None, stderr=None, shell=False, timeout=None)

subprocess.check_output(args, *, stdin=None, stderr=None, shell=False, universal_newlines=False, timeout=None)

subprocess.getstatusoutput(cmd)

subprocess.getoutput(cmd)

パラメータの説明:

  • args: 実行されるシェルコマンド。デフォルトは、['df'、 '-Th']や( 'df'、 '-Th')などの文字列のシーケンス、または 'dfなどの文字列である必要があります。 --Th 'ですが、現時点では、シェルパラメータの値をTrueに設定する必要があります。
  • shell: シェルがTrueの場合、指定されたコマンドはシェルを介して実行されますこれは、パイプ、ファイル名のワイルドカード、環境変数の展開関数など、特定のシェル機能にアクセスする必要がある場合に非常に便利です。もちろん、Python自体も、glob、fnmatch、os.walk()、os.path.expandvars()、os.expanduser()、shutilなどの多くのシェルのような機能の実装を提供します。
  • check:  checkパラメーターの値がTrueで、コマンドを実行しているプロセスがゼロ以外のステータスコードで終了する場合、CalledProcessError例外がスローされ、例外オブジェクトにはパラメーター、終了ステータスコード、およびstdoutとstderrが含まれます。 (キャプチャされた場合)。
  • stdout、stderr:
    • run()関数は、デフォルトではコマンド実行結果の通常の出力とエラー出力をキャプチャしません。これらのコンテンツを取得するためにsubprocess.PIPEを渡す必要がある場合は、返されたCompletedProcessクラスインスタンスのstdout属性とstderr属性を渡すことができます。または対応するコンテンツをキャプチャします。
    • call()関数とcheck_call()関数は、CompletedProcessクラスインスタンスではなく、コマンド実行のステータスコードを返すため、stdoutとstderrはsubprocess.PIPEへの割り当てには適していません。
    • check_output()関数はデフォルトでコマンドの実行結果を返すため、stdoutの値を設定する必要はありません。結果にエラー情報をキャプチャする場合は、stderr = subprocess.STDOUTを実行できます。
  • 入力: このパラメーターはPopen.communicate()に渡されます。通常、このパラメーターの値はバイトシーケンスである必要があり、universal_newlines = Trueの場合、その値は文字列である必要があります。
  • Universal_newlines: このパラメーターは、入力と出力のデータ形式に影響します。たとえば、その値はデフォルトでFalseです。このとき、stdoutとstderrの出力はバイトシーケンスです。このパラメーターの値がTrueに設定されている場合、 stdoutとstderrの出力はStringです。

3.subprocess.CompletedProcessクラスの概要

subprocess.run()関数はPython 3.5の新しい高度な関数であり、その戻り値はsubprocess.CompletedPorcessクラスのインスタンスであることに注意してください。したがって、subprocess.completedPorcessクラスはPython3.5にも存在します。終了したプロセスのステータス情報を表し、含まれる属性は次のとおりです。

  • args: プロセスのパラメータをロードするために使用されます。これはリストまたは文字列の場合があります
  • returncode: 子プロセスの終了ステータスコード。通常の状況では、終了ステータスコード0は、プロセスが正常に実行されたことを示します。負の値-Nは、子プロセスがシグナルNによって終了したことを示します。
  • stdout: 子プロセスからキャプチャされたstdoutこれは通常、バイトのシーケンスです。run()関数が呼び出されたときにuniversal_newlines = Trueが指定されている場合、属性値は文字列です。run()関数が呼び出されたときにstderr = subprocess.STDOUTが指定されている場合、stdoutとstderrはこの属性に統合され、stderrはNoneになります。
  • stderr: 子プロセスからキャプチャされたstderrその値は、stdout、バイトシーケンス、または文字列と同じです。stderrがキャプチャされた場合、その値はNoneです。
  • check_returncode(): 戻りコードがゼロ以外の値の場合、このメソッドはCalledProcessError例外をスローします。

4.例

subprocess.run()

>>> subprocess.run(["ls", "-l"])  # doesn't capture output
CompletedProcess(args=['ls', '-l'], returncode=0)

>>> subprocess.run("exit 1", shell=True, check=True)
Traceback (most recent call last):
  ...
subprocess.CalledProcessError: Command 'exit 1' returned non-zero exit status 1

>>> subprocess.run(["ls", "-l", "/dev/null"], stdout=subprocess.PIPE)
CompletedProcess(args=['ls', '-l', '/dev/null'], returncode=0,
stdout=b'crw-rw-rw- 1 root root 1, 3 Jan 23 16:23 /dev/null\n')

subprocess.call()

>>> subprocess.call(['ls',  '-l'])
总用量 160
drwxr-xr-x  2 wader wader   4096 12月  7  2015 公共的
drwxr-xr-x  2 wader wader   4096 12月  7  2015 模板
drwxr-xr-x  2 wader wader   4096 12月  7  2015 视频
drwxr-xr-x  2 wader wader   4096 12月  7  2015 图片
drwxr-xr-x  2 wader wader   4096 12月  7  2015 文档
drwxr-xr-x  2 wader wader   4096  4月 13  2016 下载
drwxr-xr-x  2 wader wader   4096 12月  7  2015 音乐
drwxr-xr-x  7 wader wader   4096  5月 26  2016 桌面
0
>>> subprocess.call('ls -l', shell=True)
总用量 160
drwxr-xr-x  2 wader wader   4096 12月  7  2015 公共的
drwxr-xr-x  2 wader wader   4096 12月  7  2015 模板
drwxr-xr-x  2 wader wader   4096 12月  7  2015 视频
drwxr-xr-x  2 wader wader   4096 12月  7  2015 图片
drwxr-xr-x  2 wader wader   4096 12月  7  2015 文档
drwxr-xr-x  2 wader wader   4096  4月 13  2016 下载
drwxr-xr-x  2 wader wader   4096 12月  7  2015 音乐
drwxr-xr-x  7 wader wader   4096  5月 26  2016 桌面
0
>>> subprocess.call(['ls',  '-l'], stdout=subprocess.DEVNULL)
0
>>> subprocess.call(['ls',  '-l', '/test'])
ls: 无法访问/test: 没有那个文件或目录
2

suprocess.check_call()

>>> subprocess.check_call(['ls',  '-l'])
总用量 160
drwxr-xr-x  2 wader wader   4096 12月  7  2015 公共的
drwxr-xr-x  2 wader wader   4096 12月  7  2015 模板
drwxr-xr-x  2 wader wader   4096 12月  7  2015 视频
drwxr-xr-x  2 wader wader   4096 12月  7  2015 图片
drwxr-xr-x  2 wader wader   4096 12月  7  2015 文档
drwxr-xr-x  2 wader wader   4096  4月 13  2016 下载
drwxr-xr-x  2 wader wader   4096 12月  7  2015 音乐
drwxr-xr-x  7 wader wader   4096  5月 26  2016 桌面
0
>>> subprocess.check_call('ls -l', shell=True)
总用量 160
drwxr-xr-x  2 wader wader   4096 12月  7  2015 公共的
drwxr-xr-x  2 wader wader   4096 12月  7  2015 模板
drwxr-xr-x  2 wader wader   4096 12月  7  2015 视频
drwxr-xr-x  2 wader wader   4096 12月  7  2015 图片
drwxr-xr-x  2 wader wader   4096 12月  7  2015 文档
drwxr-xr-x  2 wader wader   4096  4月 13  2016 下载
drwxr-xr-x  2 wader wader   4096 12月  7  2015 音乐
drwxr-xr-x  7 wader wader   4096  5月 26  2016 桌面
0
>>> subprocess.check_call('ls -l /test', shell=True)
ls: 无法访问/test: 没有那个文件或目录
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python3.4/subprocess.py", line 557, in check_call
    raise CalledProcessError(retcode, cmd)
subprocess.CalledProcessError: Command 'ls -l /test' returned non-zero exit status 2

sbuprocess.check_output()

>>> ret = subprocess.check_output(['ls',  '-l'])
>>> print(ret)
b' \xe5\x85\xac\xe5\x85\xb1\xe7\x9a\x84\ndrwxr-xr-x  2 wader wader   4096 12\xe6\x9c\x88  7  2015 \xe6\xa8\xa1\xe6\x9d\xbf\ndrwxr-xr-x  2 wader wader   4096 12\xe6\x9c\x88  7  2015 \xe8\xa7\x86\xe9\xa2\x91\ndrwxr-xr-x  2 wader wader   4096 12\xe6\x9c\x88  7  2015 \xe5\x9b\xbe\xe7\x89\x87\ndrwxr-xr-x  2 wader wader   4096 12\xe6\x9c\x88  7  2015 \xe6\x96\x87\xe6\xa1\xa3\ndrwxr-xr-x  2 wader wader   4096  4\xe6\x9c\x88 13  2016 \xe4\xb8\x8b\xe8\xbd\xbd\ndrwxr-xr-x  2 wader wader   4096 12\xe6\x9c\x88  7  2015 \xe9\x9f\xb3\xe4\xb9\x90\ndrwxr-xr-x  7 wader wader   4096  5\xe6\x9c\x88 26  2016 \xe6\xa1\x8c\xe9\x9d\xa2\n'
>>> ret = subprocess.check_output(['ls',  '-l'], universal_newlines=True)
>>> print(ret)
总用量 160
drwxr-xr-x  2 wader wader   4096 12月  7  2015 公共的
drwxr-xr-x  2 wader wader   4096 12月  7  2015 模板
drwxr-xr-x  2 wader wader   4096 12月  7  2015 视频
drwxr-xr-x  2 wader wader   4096 12月  7  2015 图片
drwxr-xr-x  2 wader wader   4096 12月  7  2015 文档
drwxr-xr-x  2 wader wader   4096  4月 13  2016 下载
drwxr-xr-x  2 wader wader   4096 12月  7  2015 音乐
drwxr-xr-x  7 wader wader   4096  5月 26  2016 桌面

subprocess.getoutput()与subprocess.getstatusoutput()

>>> ret = subprocess.getoutput('ls -l')
>>> print(ret)
总用量 160
drwxr-xr-x  2 wader wader   4096 12月  7  2015 公共的
drwxr-xr-x  2 wader wader   4096 12月  7  2015 模板
drwxr-xr-x  2 wader wader   4096 12月  7  2015 视频
drwxr-xr-x  2 wader wader   4096 12月  7  2015 图片
drwxr-xr-x  2 wader wader   4096 12月  7  2015 文档
drwxr-xr-x  2 wader wader   4096  4月 13  2016 下载
drwxr-xr-x  2 wader wader   4096 12月  7  2015 音乐
drwxr-xr-x  7 wader wader   4096  5月 26  2016 桌面
>>> retcode, output = subprocess.getstatusoutput('ls -l')
>>> print(retcode)
0
>>> print(output)
总用量 160
drwxr-xr-x  2 wader wader   4096 12月  7  2015 公共的
drwxr-xr-x  2 wader wader   4096 12月  7  2015 模板
drwxr-xr-x  2 wader wader   4096 12月  7  2015 视频
drwxr-xr-x  2 wader wader   4096 12月  7  2015 图片
drwxr-xr-x  2 wader wader   4096 12月  7  2015 文档
drwxr-xr-x  2 wader wader   4096  4月 13  2016 下载
drwxr-xr-x  2 wader wader   4096 12月  7  2015 音乐
drwxr-xr-x  7 wader wader   4096  5月 26  2016 桌面
>>> retcode, output = subprocess.getstatusoutput('ls -l /test')
>>> print(retcode)
2
>>> print(output)
ls: 无法访问/test: 没有那个文件或目录

3、サブプロセス。Popenの紹介


このクラスは、新しいプロセスでサブルーチンを実行するために使用されます。前述したように、上記で紹介したこれらの関数は、subprocess.Popenクラスに基づいて実装されており、これらのカプセル化された高度な関数を使用することで、多くの面でいくつかの一般的な要件を満たすことができます。サブプロセスモジュールの下部にあるプロセスの作成と管理はPopenクラスによって処理されるため、上記の高度な関数を使用してあまり一般的でない関数を実現できない場合は、subprocess.Popenクラスによって提供される柔軟なAPIを使用して完了できます。 。

1.subprocess.Popenのコンストラクター

class subprocess.Popen(args, bufsize=-1, executable=None, stdin=None, stdout=None, stderr=None, 
    preexec_fn=None, close_fds=True, shell=False, cwd=None, env=None, universal_newlines=False,
    startup_info=None, creationflags=0, restore_signals=True, start_new_session=False, pass_fds=())

パラメータの説明:

  • args: 実行されるシェルコマンド。コマンドの文字列またはパラメータのシーケンスにすることができます。パラメータの値が文字列の場合、コマンドの解釈プロセスはプラットフォームに依存するため、通常はargsパラメータをシーケンスとして渡すことをお勧めします。
  • bufsize: キャッシュ戦略を指定します。0はバッファリングなし、1は行バッファリング、1より大きい他の数値はバッファサイズ、負の数はシステムのデフォルトのバッファリング戦略を使用することを意味します。
  • stdin、stdout、stderr: それぞれ、プログラムの標準入力、出力、およびエラーハンドルを表します
  • preexec_fn: 子プロセスが実行される前に呼び出される実行可能オブジェクトを指定するために使用されます。Unixプラットフォームでのみ有効です。
  • close_fds: このパラメーターの値がTrueの場合、子プロセスが実行される前に、0、1、および2を除くすべてのファイル記述子が閉じられます。
  • shell: このパラメーターは、実行するプログラムとしてシェルを使用するかどうかを識別するために使用されます。シェル値がTrueの場合、argsパラメーターをシーケンスではなく文字列として渡すことをお勧めします
  • cwd: パラメータ値がNoneでない場合、関数はこのサブプロセスを実行する前に現在の作業ディレクトリを変更します。
  • env: 子プロセスの環境変数を指定するために使用されます。env= Noneの場合、子プロセスの環境変数は親プロセスから継承されます。env!= Noneの場合、その値はマッピングオブジェクトである必要があります。
  • Universal_newlines: パラメーター値がTrueの場合、ファイルオブジェクトのstdin、stdout、およびstderrはテキストストリームとして開かれます。それ以外の場合は、バイナリストリームとして開かれます。
  • startupinfoとcreationflags: これらの2つのパラメーターは、Windowsでのみ有効です。これらは、基になるCreateProcess()関数に渡され、メインウィンドウの外観、プロセスの優先度など、子プロセスのいくつかの属性を設定します。

2.subprocess.Popenクラスのインスタンスから呼び出すことができるメソッド

方法 説明
Popen.poll() ために使用されるサブプロセス(コマンド)が実行されたかどうかをチェックしいずれも返されません、それがされた場合に終了していない、とステータスコードは、終了後に返却されます。
Popen.wait(timeout = None) 子プロセスの終了を待ち、ステータスコードを返します。timeoutで指定された秒数が経過してもプロセスが終了しなかった場合、TimeoutExpired例外がスローされます。
Popen.communicate(input = None、timeout = None) このメソッドは、ファイルの終わりに達するまで、stdinへのデータの送信、stdoutおよびstderrからのデータの読み取りなど、プロセスと対話するために使用できます。
Popen.send_signal(signal) 指定されたシグナルをこの子プロセスに送信します。
Popen.terminate() 子プロセスを停止します。
Popen.kill() 子プロセスを強制終了します。

communication()メソッドの説明:

  • このメソッドに入力されるオプションのパラメーターは、子プロセスに送信されるデータである必要があります。または、子プロセスにデータが送信されない場合、パラメーターはNoneである必要があります。入力パラメータのデータ型はバイト文字列である必要があります。universal_newlinesパラメータ値がTrueの場合、入力パラメータのデータ型は文字列である必要があります。
  • このメソッドはタプル(stdout_data、stderr_data)を返します。これらのデータはバイトまたは文字列になります(universal_newlinesの値がTrueの場合)。
  • タイムアウトで指定された秒数が経過してもプロセスが終了しなかった場合、TimeoutExpired例外がスローされます。この例外をキャッチし、出力データを失うことなく通信を再試行してください。ただし、タイムアウト後に子プロセスが強制終了されることはありません。対応するコンテンツを合理的にクリアするには、適切なアプリケーションが手動で子プロセスを強制終了して通信を終了する必要があります。
  • ここで読み取られるデータはメモリにバッファリングされるため、データサイズが非常に大きいか無制限の場合は、この方法を使用しないでください。

3.subprocess.Popenの使用例

例1:

>>> import subprocess
>>>
>>> p = subprocess.Popen('df -Th', stdout=subprocess.PIPE, shell=True)
>>> print(p.stdout.read())
Filesystem     Type      Size  Used Avail Use% Mounted on
/dev/vda1      ext4       40G   12G   26G  31% /
devtmpfs       devtmpfs  3.9G     0  3.9G   0% /dev
tmpfs          tmpfs     3.9G     0  3.9G   0% /dev/shm
tmpfs          tmpfs     3.9G  386M  3.5G  10% /run
tmpfs          tmpfs     3.9G     0  3.9G   0% /sys/fs/cgroup
tmpfs          tmpfs     783M     0  783M   0% /run/user/0
tmpfs          tmpfs     783M     0  783M   0% /run/user/1000

例2:

>>> obj = subprocess.Popen(["python"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
>>> obj.stdin.write('print(1) \n')
>>> obj.stdin.write('print(2) \n')
>>> obj.stdin.write('print(3) \n')
>>> out,err = obj.communicate()
>>> print(out)
1
2
3

>>> print(err)

例3:

>>> obj = subprocess.Popen(["python"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
>>> out,err = obj.communicate(input='print(1) \n')
>>> print(out)
1

>>> print(err)

例4:

同様のdf -Th | grep dataコマンドの機能を実現することは、実際にはシェル内のパイプラインの共通機能を実現することです。

>>> 
>>> p1 = subprocess.Popen(['df', '-Th'], stdout=subprocess.PIPE)
>>> p2 = subprocess.Popen(['grep', 'data'], stdin=p1.stdout, stdout=subprocess.PIPE)
>>> out,err = p2.communicate()
>>> print(out)
/dev/vdb1      ext4      493G  4.8G  463G   2% /data
/dev/vdd1      ext4     1008G  420G  537G  44% /data1
/dev/vde1      ext4      985G  503G  432G  54% /data2

>>> print(err)
None
def sync_call(cmd, chdir):
    os.chdir(chdir)
    p = subprocess.Popen(
        cmd,
        shell=True,
        stdout=subprocess.PIPE,
        stderr=subprocess.STDOUT)
    out, err = p.communicate()
    if p.returncode == 0 or p.returncode is None:
        flag = True
    else:
        flag = False
    return flag, out.decode()  # out.decode(返回的是cmd命令运行过程中输出的内容)

4、まとめ


では、システムやシステムと対話するためのコマンドを実行するには、どのモジュールと関数を使用する必要がありますか?以下に要約を作成しましょう。

  • 最初に知っておくべきことは、Python 2.4バージョンでは、os.system()、os.popen()、os.spawn *()、その他の関数とコマンドモジュールを置き換えるサブプロセスモジュールが導入されたことです。 Pythonバージョン2.4以降を使用している場合は、サブプロセスモジュールを使用する必要があります。
  • アプリケーションがPython2.4以降を使用しているがPython3.5以下を使用している場合、Pythonからの公式の推奨事項はsubprocess.call()関数を使用することです。Python 2.5ではsubprocess.check_call()関数が追加され、Python 2.7ではsubprocess.check_output()関数が追加されました。これら2つの関数は、必要に応じて使用することもできます。
  • アプリケーションがPython3.5以降を使用している場合(現時点ではまれなはずです)、Pythonが提供する公式のアドバイスは、可能な限りsubprocess.run()関数を使用することです。
  • subprocess.call()、subprocess.check_call()、subprocess.check_output()、subprocess.run()の高度な関数がニーズを満たせない場合は、subprocess.Popenクラスを使用して必要な複雑な関数を実装できます。

おすすめ

転載: blog.csdn.net/zangba9624/article/details/109529721