36.11. パイプ—シェルパイプラインへのインターフェース—Pythonドキュメント

提供:Dev Guides
< PythonPython/docs/2.7/library/pipes
移動先:案内検索

36.11。 パイプ —シェルパイプラインへのインターフェース

ソースコード: :source: `Lib / pipes.py`



pipes モジュールは、 pipeline の概念を抽象化するクラスを定義します—あるファイルから別のファイルへのコンバーターのシーケンス。

モジュールは / bin / sh コマンドラインを使用するため、 os.system()および os.popen()用のPOSIXまたは互換性のあるシェルが必要です。

class pipes.Template
パイプラインの抽象化。

例:

>>> import pipes
>>> t = pipes.Template()
>>> t.append('tr a-z A-Z', '--')
>>> f = t.open('pipefile', 'w')
>>> f.write('hello world')
>>> f.close()
>>> open('pipefile').read()
'HELLO WORLD'
pipes.quote(s)

バージョン2.7以降非推奨: Python 2.7より前は、この関数は公開されていませんでした。 最終的に、Python3.3では shlex モジュールのquote関数として公開されます。

文字列 s のシェルエスケープバージョンを返します。 戻り値は、リストを使用できない場合に備えて、シェルコマンドラインで1つのトークンとして安全に使用できる文字列です。

このイディオムは安全ではありません。

>>> filename = 'somefile; rm -rf ~'
>>> command = 'ls -l {}'.format(filename)
>>> print command  # executed by a shell: boom!
ls -l somefile; rm -rf ~

quote()を使用すると、セキュリティホールを塞ぐことができます。

>>> command = 'ls -l {}'.format(quote(filename))
>>> print command
ls -l 'somefile; rm -rf ~'
>>> remote_command = 'ssh home {}'.format(quote(command))
>>> print remote_command
ssh home 'ls -l '"'"'somefile; rm -rf ~'"'"''

引用はUNIXシェルおよび shlex.split()と互換性があります。

>>> remote_command = shlex.split(remote_command)
>>> remote_command
['ssh', 'home', "ls -l 'somefile; rm -rf ~'"]
>>> command = shlex.split(remote_command[-1])
>>> command
['ls', '-l', 'somefile; rm -rf ~']

36.11.1。 テンプレートオブジェクト

メソッドに続くテンプレートオブジェクト:

Template.reset()
パイプラインテンプレートを初期状態に復元します。
Template.clone()
新しい同等のパイプラインテンプレートを返します。
Template.debug(flag)
flag がtrueの場合、デバッグをオンにします。 それ以外の場合は、デバッグをオフにします。 デバッグがオンの場合、実行されるコマンドが出力され、シェルにはset -xコマンドが与えられてより詳細になります。
Template.append(cmd, kind)

最後に新しいアクションを追加します。 cmd 変数は、有効なBourneシェルコマンドである必要があります。 kind 変数は2文字で構成されています。

最初の文字は、'-'(コマンドが標準入力を読み取ることを意味します)、'f'(コマンドがコマンドラインで特定のファイルを読み取ることを意味します)、または [X179Xのいずれかです。 ](つまり、コマンドは入力を読み取らないため、最初に入力する必要があります。)

同様に、2番目の文字は、'-'(コマンドが標準出力に書き込むことを意味します)、'f'(コマンドがコマンドラインにファイルを書き込むことを意味します)、または [のいずれかになります。 X188X](これは、コマンドが何も書き込まないため、最後でなければならないことを意味します。)

Template.prepend(cmd, kind)
最初に新しいアクションを追加します。 引数の説明については、 append()を参照してください。
Template.open(file, mode)
file に対して開かれているが、パイプラインからの読み取りまたはパイプラインによって書き込まれたファイルのようなオブジェクトを返します。 'r''w'のいずれか1つのみを指定できることに注意してください。
Template.copy(infile, outfile)
パイプを介して infileoutfile にコピーします。