Python管道模块如何做“猫”

时间:2011-08-18 22:22:34

标签: python pipe

我正在尝试在python中执行此操作:

cat foo | ssh me@xxxx hadoop fs -put - bar/foo

我最初尝试过check_call:

foo = 'foo'
subprocess.check_call(['cat', foo, '|','ssh',os.environ['USER']+'@'+hadoopGateway,'hadoop','fs','-put', '-', inputArgs.targetDir+'/'+foo])

产生错误:

cat: invalid option -- 'p'

我查看了python管道模块文档,并在shell中使用它,但我不明白如何在没有输出文件的情况下启动它,如示例。

>>> t = pipes.Template()
>>> t.prepend('cat foo', '.-')
>>> t.append('hadoop fs -put - bar/foo', '-.') # what next

显然我错过了一些东西。

1 个答案:

答案 0 :(得分:4)

您不需要cat或管道;您只需要将文件作为ssh命令的标准输入提供。在shell中,那将是

ssh ${USER}@${hadoopGateway} hadoop fs -put - ${targetDir}/foo < foo

并且使用Python子进程模块它只涉及更多:

foo='foo'
subprocess.check_call(['ssh',
                       os.environ['USER']+'@'+hadoopGateway,
                       'hadoop', 'fs', '-put', '-', inputArgs.targetDir+'/'+foo],
                      stdin=open(foo, 'r'))