目次
3.commands.getstatusoutput()関数の例
3.subprocess.CompletedProcessクラスの概要
2.subprocess.Popenクラスのインスタンスから呼び出すことができるメソッド
Linuxプラットフォームのシェルなど、ほとんどすべてのオペレーティングシステムでコマンドライン命令を使用してオペレーティングシステムと対話できます。では、Pythonを使用してこれらのコマンドライン命令の実行を完了するにはどうすればよいでしょうか。さらに、知っておくべきことは、コマンドライン命令の実行には通常、次の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プラットフォームをサポートしていません。 |
説明:
- os.popen(command)関数はファイルオブジェクトを取得するため、read()メソッドに加えて、コマンドに応じてwrite()およびその他のメソッドもサポートします。
- コマンドモジュールは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()に似ています。 |
説明:
- Python 3.5以降のバージョンでは、公式ドキュメントでは、サブプロセスモジュールの関数を使用するために、他の関数の代わりにsubprocess.run()関数を推奨しています。
- Python 3.5より前のバージョンでは、subprocess.call()、subprocess.getoutput()、および上記の他の関数を介してサブプロセスモジュールの関数を使用できます。
- subprocess.run()、subprocess.call()、subprocess.check_call()、subprocess.check_output()はすべて、subprocess.Popenをカプセル化することで実装される高度な関数です。したがって、より複雑な関数が必要な場合は、subprocess.Popenを使用して完了できます。 。
- 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クラスを使用して必要な複雑な関数を実装できます。