python-subprocess、glob、shlexモジュール
6097 ワード
一、subprocessモジュール
1.subprocessおよび一般的なパッケージ関数
pythonを実行するときは、プロセスを作成して実行します.Linuxプロセスのように、1つのプロセスは1つのサブプロセスをforkし、このサブプロセスexecの別のプログラムを譲ることができます.Pythonでは、標準ライブラリのsubprocessパッケージを使用してサブプロセスをforkし、外部のプログラムを実行します.
subprocessパッケージには、サブプロセスを作成する関数がいくつか定義されています.これらの関数は、それぞれ異なる方法でサブプロセスを作成するので、必要に応じて使用を選択できます.さらにsubprocessは、プロセス間でテキスト通信を使用するために標準ストリームとパイプを管理するツールも提供しています.
subprocess.call()
親プロセスは子プロセスの完了を待つ
終了情報を返す(returncode、Linux exit codeに相当)
subprocess.check_call()
親プロセスは子プロセスの完了を待つ
0を返します
終了情報をチェックし、returncodeが0でない場合はエラーsubprocessを挙げる.CalledProcessError、このオブジェクトにはreturncode属性が含まれており、try...except...でチェックできます.
例:
実行結果:
call fail
hello,China
subprocess.check_output()
親プロセスは子プロセスの完了を待つ
サブプロセスから標準に出力された出力結果を返します.
終了情報をチェックし、returncodeが0でない場合はエラーsubprocessを挙げる.CalledProcessError、このオブジェクトにはreturncode属性とoutput属性が含まれています.output属性は標準出力の出力結果で、try...except...でチェックできます.
例:
実行結果:
-rw-r--r-- 1 root root 94 Jan 19 22:09 001.py
-rw-r--r-- 1 root root 255 Jan 19 22:19 002.py
-rw-r--r-- 1 root root 101 Jan 19 22:59 003.py
説明:
プログラム名(ls)と持つパラメータ(-l)を一緒にリストに入れてsubprocessに渡す.check_output();
shellのデフォルトはFalseであり、Linuxでshell=Falseの場合、Popenはosを呼び出す.execvp()argsで指定したプログラムを実行します.shell=Trueの場合、argsが文字列である場合、Popenは直接システムのShellを呼び出してargsが指定したプログラムを実行し、argsがシーケンスである場合、argsの最初の項目はプログラムコマンド文字列を定義し、他の項目はシステムShellを呼び出す際の追加パラメータである.
または例:
subprocess.Popen()
class Popen(args, bufsize=0, executable=None, stdin=None, stdout=None, stderr=None, preexec_fn=None, close_fds=False, shell=False, cwd=None, env=None, universal_newlines=False, startupinfo=None, creationflags=0)
Popenオブジェクトが作成されると、メインプログラムはサブプロセスの完了を自動的に待つことはありません.親プロセスが待つ(つまりブロック)オブジェクトのwait()メソッドを呼び出さなければなりません
例1(親プロセスは子プロセスを待たない):
実行結果:
hello,China
[root@huangzp3 python]# PING www.a.shifen.com (14.215.177.38) 56(84) bytes of data.
64 bytes from 14.215.177.38 (14.215.177.38): icmp_seq=1 ttl=56 time=7.45 ms
64 bytes from 14.215.177.38 (14.215.177.38): icmp_seq=2 ttl=56 time=7.29 ms
64 bytes from 14.215.177.38 (14.215.177.38): icmp_seq=3 ttl=56 time=8.05 ms
説明:
親プロセスは、サブプロセスを開いた後、childの完了を待つのではなくprintを直接実行します.
例2(親プロセスが子プロセスを待つ):
実行結果:
PING www.a.shifen.com (14.215.177.39) 56(84) bytes of data.
64 bytes from 14.215.177.39 (14.215.177.39): icmp_seq=1 ttl=56 time=5.49 ms
64 bytes from 14.215.177.39 (14.215.177.39): icmp_seq=2 ttl=56 time=5.69 ms
64 bytes from 14.215.177.39 (14.215.177.39): icmp_seq=3 ttl=56 time=6.66 ms
--- www.a.shifen.com ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2004ms
rtt min/avg/max/mdev = 5.496/5.950/6.664/0.514 ms
hello,China
親プロセスによる子プロセスのその他の操作:
child.Poll()サブプロセスステータスのチェック
child.kill()サブプロセスの終了
child.send_Signal()#サブプロセスへの信号送信
child.terminate()#サブプロセスの終了
child.pid#ストレージサブプロセスのPID
2.サブプロセスのテキストフロー制御
サブプロセスの標準入力、標準出力、および標準エラーは、次の属性でそれぞれ表示されます.
child.stdin
child.stdout
child.stderr
Popen()がサブプロセスを確立するときに標準入力、標準出力、標準エラーを変更することができ、subprocessを利用することができる.PIPEは複数のサブプロセスの入出力を接続し、パイプ(pipe)を構成する.stdinとstdoutが書かれていない場合は、メモリに保存するのではなく、デフォルトでサブプロセス実行結果を画面に印刷します.
例1:
実行結果:
-rw-r--r-- 1 root root 94 Jan 19 22:09 001.py
-rw-r--r-- 1 root root 255 Jan 19 22:19 002.py
-rw-r--r-- 1 root root 149 Jan 20 00:47 003.py
例2:
実行結果:
r('root:x:0:0:root:/root:/bin/bashzabbix:x:1001:1001::/home/zabbix:/bin/bashelk:x:1002:1002::/home/elk:/bin/bashmemcached:x:1003:1003::/home/memcached:/bin/bash', None)
説明:
subprocess.PIPEパイプラインは、実際にはテキストストリームにキャッシュ領域を提供します.child 1のstdoutはテキストをキャッシュ領域に出力し、child 2のstdinはこのPIPEからテキストを読み出す.child 2の出力テキストも、communicate()メソッドがPIPEからPIPEのテキストを読み出すまでPIPEに格納される.communicate()は、子プロセスが完了するまで親プロセスをブロックするPopenオブジェクトのメソッドです.child2.communicate()はchild 2に相当する.write()、child2.close()、child2.read()この3つの方法
二、globモジュール
pythonの下のshellワイルドカードは、windowsの下のファイル検索と同様に、特定のルールに合致するファイルパス名を検索できます.3つの一致文字にのみ使用します:「*」、「?」"[]".「*」は0文字以上、「?」1文字に一致し、[]は指定した範囲の文字に一致します.
1.glob.glob
一致するすべてのファイルパスのリストを返します.パラメータpathnameは1つしかありません.ファイルパスマッチングルールが定義されています.絶対パスでも相対パスでも構いません.
例:
2.glob.iglob
それに比べてglob、遍歴可能なオブジェクトを取得し、一致するファイルパス名を1つずつ取得できます.
三、shlexモジュール
shlex.split(s[, comments[, posix]])
shellのような構文で文字列sを分割する、デフォルトではスペースで区切られ、shlex.split()は引用符を認識し、引用符の中の要素を1つとすることができます.
例:
1.subprocessおよび一般的なパッケージ関数
pythonを実行するときは、プロセスを作成して実行します.Linuxプロセスのように、1つのプロセスは1つのサブプロセスをforkし、このサブプロセスexecの別のプログラムを譲ることができます.Pythonでは、標準ライブラリのsubprocessパッケージを使用してサブプロセスをforkし、外部のプログラムを実行します.
subprocessパッケージには、サブプロセスを作成する関数がいくつか定義されています.これらの関数は、それぞれ異なる方法でサブプロセスを作成するので、必要に応じて使用を選択できます.さらにsubprocessは、プロセス間でテキスト通信を使用するために標準ストリームとパイプを管理するツールも提供しています.
subprocess.call()
親プロセスは子プロセスの完了を待つ
終了情報を返す(returncode、Linux exit codeに相当)
subprocess.check_call()
親プロセスは子プロセスの完了を待つ
0を返します
終了情報をチェックし、returncodeが0でない場合はエラーsubprocessを挙げる.CalledProcessError、このオブジェクトにはreturncode属性が含まれており、try...except...でチェックできます.
例:
#!/usr/bin/env python
import subprocess
try:
subprocess.check_call("exit 1",shell=True)
except subprocess.CalledProcessError:
print "call fail"
except Exception,e:
print e
print "hello,China"
実行結果:
call fail
hello,China
subprocess.check_output()
親プロセスは子プロセスの完了を待つ
サブプロセスから標準に出力された出力結果を返します.
終了情報をチェックし、returncodeが0でない場合はエラーsubprocessを挙げる.CalledProcessError、このオブジェクトにはreturncode属性とoutput属性が含まれています.output属性は標準出力の出力結果で、try...except...でチェックできます.
例:
#!/usr/bin/env python
import subprocess
retcode = subprocess.check_output(["ls","-l"]) # shell
print retcode
実行結果:
-rw-r--r-- 1 root root 94 Jan 19 22:09 001.py
-rw-r--r-- 1 root root 255 Jan 19 22:19 002.py
-rw-r--r-- 1 root root 101 Jan 19 22:59 003.py
説明:
プログラム名(ls)と持つパラメータ(-l)を一緒にリストに入れてsubprocessに渡す.check_output();
shellのデフォルトはFalseであり、Linuxでshell=Falseの場合、Popenはosを呼び出す.execvp()argsで指定したプログラムを実行します.shell=Trueの場合、argsが文字列である場合、Popenは直接システムのShellを呼び出してargsが指定したプログラムを実行し、argsがシーケンスである場合、argsの最初の項目はプログラムコマンド文字列を定義し、他の項目はシステムShellを呼び出す際の追加パラメータである.
または例:
#!/usr/bin/env python
import subprocess
retcode = subprocess.check_output("ls -l",shell=True) # , shell
print retcode
subprocess.Popen()
class Popen(args, bufsize=0, executable=None, stdin=None, stdout=None, stderr=None, preexec_fn=None, close_fds=False, shell=False, cwd=None, env=None, universal_newlines=False, startupinfo=None, creationflags=0)
Popenオブジェクトが作成されると、メインプログラムはサブプロセスの完了を自動的に待つことはありません.親プロセスが待つ(つまりブロック)オブジェクトのwait()メソッドを呼び出さなければなりません
例1(親プロセスは子プロセスを待たない):
#!/usr/bin/env python
import subprocess
child = subprocess.Popen("ping -c 3 www.baidu.com",shell=True)
print "hello,China"
実行結果:
hello,China
[root@huangzp3 python]# PING www.a.shifen.com (14.215.177.38) 56(84) bytes of data.
64 bytes from 14.215.177.38 (14.215.177.38): icmp_seq=1 ttl=56 time=7.45 ms
64 bytes from 14.215.177.38 (14.215.177.38): icmp_seq=2 ttl=56 time=7.29 ms
64 bytes from 14.215.177.38 (14.215.177.38): icmp_seq=3 ttl=56 time=8.05 ms
説明:
親プロセスは、サブプロセスを開いた後、childの完了を待つのではなくprintを直接実行します.
例2(親プロセスが子プロセスを待つ):
#!/usr/bin/env python
import subprocess
child = subprocess.Popen("ping -c 3 www.baidu.com",shell=True)
child.wait()
print "hello,China"
実行結果:
PING www.a.shifen.com (14.215.177.39) 56(84) bytes of data.
64 bytes from 14.215.177.39 (14.215.177.39): icmp_seq=1 ttl=56 time=5.49 ms
64 bytes from 14.215.177.39 (14.215.177.39): icmp_seq=2 ttl=56 time=5.69 ms
64 bytes from 14.215.177.39 (14.215.177.39): icmp_seq=3 ttl=56 time=6.66 ms
--- www.a.shifen.com ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2004ms
rtt min/avg/max/mdev = 5.496/5.950/6.664/0.514 ms
hello,China
親プロセスによる子プロセスのその他の操作:
child.Poll()サブプロセスステータスのチェック
child.kill()サブプロセスの終了
child.send_Signal()#サブプロセスへの信号送信
child.terminate()#サブプロセスの終了
child.pid#ストレージサブプロセスのPID
2.サブプロセスのテキストフロー制御
サブプロセスの標準入力、標準出力、および標準エラーは、次の属性でそれぞれ表示されます.
child.stdin
child.stdout
child.stderr
Popen()がサブプロセスを確立するときに標準入力、標準出力、標準エラーを変更することができ、subprocessを利用することができる.PIPEは複数のサブプロセスの入出力を接続し、パイプ(pipe)を構成する.stdinとstdoutが書かれていない場合は、メモリに保存するのではなく、デフォルトでサブプロセス実行結果を画面に印刷します.
例1:
#!/usr/bin/env python
import subprocess
child = subprocess.Popen(["ls","-l"],stdout=subprocess.PIPE)
print child.stdout.read()
実行結果:
-rw-r--r-- 1 root root 94 Jan 19 22:09 001.py
-rw-r--r-- 1 root root 255 Jan 19 22:19 002.py
-rw-r--r-- 1 root root 149 Jan 20 00:47 003.py
例2:
#!/usr/bin/env python
import subprocess
child1 = subprocess.Popen(["cat","/etc/passwd"],stdout=subprocess.PIPE)
child2 = subprocess.Popen(["grep","/bin/bash"],stdin=child1.stdout,stdout=subprocess.PIPE)
out = child2.communicate()
print out
実行結果:
r('root:x:0:0:root:/root:/bin/bashzabbix:x:1001:1001::/home/zabbix:/bin/bashelk:x:1002:1002::/home/elk:/bin/bashmemcached:x:1003:1003::/home/memcached:/bin/bash', None)
説明:
subprocess.PIPEパイプラインは、実際にはテキストストリームにキャッシュ領域を提供します.child 1のstdoutはテキストをキャッシュ領域に出力し、child 2のstdinはこのPIPEからテキストを読み出す.child 2の出力テキストも、communicate()メソッドがPIPEからPIPEのテキストを読み出すまでPIPEに格納される.communicate()は、子プロセスが完了するまで親プロセスをブロックするPopenオブジェクトのメソッドです.child2.communicate()はchild 2に相当する.write()、child2.close()、child2.read()この3つの方法
二、globモジュール
pythonの下のshellワイルドカードは、windowsの下のファイル検索と同様に、特定のルールに合致するファイルパス名を検索できます.3つの一致文字にのみ使用します:「*」、「?」"[]".「*」は0文字以上、「?」1文字に一致し、[]は指定した範囲の文字に一致します.
1.glob.glob
一致するすべてのファイルパスのリストを返します.パラメータpathnameは1つしかありません.ファイルパスマッチングルールが定義されています.絶対パスでも相対パスでも構いません.
例:
In [1]: import glob
In [2]: glob.glob("./*.py")
Out[2]:
['./20.py',
'./1.py',
2.glob.iglob
それに比べてglob、遍歴可能なオブジェクトを取得し、一致するファイルパス名を1つずつ取得できます.
三、shlexモジュール
shlex.split(s[, comments[, posix]])
shellのような構文で文字列sを分割する、デフォルトではスペースで区切られ、shlex.split()は引用符を認識し、引用符の中の要素を1つとすることができます.
例:
In [7]: import shlex
In [8]: shlex.split('hello","word')
Out[8]: ['hello,word']