36.11. 管道 — shell 管道的接口 — Python 文档

来自菜鸟教程
Python/docs/2.7/library/pipes
跳转至:导航、​搜索

36.11. 管道 — 与 shell 管道的接口

源代码: :source:`Lib/pipes.py`



pipes 模块定义了一个类来抽象 pipeline 的概念——从一个文件到另一个文件的转换器序列。

由于模块使用 /bin/sh 命令行,因此需要 os.system()os.popen() 的 POSIX 或兼容 shell。

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 之前,此函数未公开记录。 它最终在 Python 3.3 中作为 shlex 模块中的 quote 函数公开公开。

返回字符串 s 的 shell 转义版本。 返回值是一个字符串,可以安全地用作 shell 命令行中的一个标记,用于无法使用列表的情况。

这个习语是不安全的:

>>> 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 shell 和 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 为真,则打开调试。 否则,关闭调试。 当调试打开时,将打印要执行的命令,并为 shell 提供 set -x 命令更详细。
Template.append(cmd, kind)

在最后追加一个新动作。 cmd 变量必须是有效的 bourne shell 命令。 kind 变量由两个字母组成。

第一个字母可以是 '-'(表示命令读取其标准输入)、'f'(表示命令读取命令行上的给定文件)或 '.' ](这意味着命令不读取输入,因此必须是第一个。)

同样,第二个字母可以是 '-'(表示命令写入标准输出)、'f'(表示该命令在命令行写入文件)或 [ X188X](这意味着该命令不写入任何内容,因此必须在最后。)

Template.prepend(cmd, kind)
在开头添加一个新动作。 有关参数的解释,请参阅 append()
Template.open(file, mode)
返回一个类文件对象,打开到 file,但从管道读取或写入。 请注意,只能给出 'r''w' 之一。
Template.copy(infile, outfile)
通过管道将 infile 复制到 outfile