我正在尝试在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
显然我错过了一些东西。
答案 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'))