36.11. 管道 — shell 管道的接口 — Python 文档
来自菜鸟教程
Python/docs/2.7/library/pipes
36.11. 管道 — 与 shell 管道的接口
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。