Как бы модуль Python pipe сделал 'кошку' - PullRequest
1 голос
/ 19 августа 2011

Я пытаюсь сделать это в 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 pipe и поиграл с ним в оболочке, но я не понимаю, как запустить его без выходного файла, как в примере.

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

Я явно что-то упускаю.

1 Ответ

4 голосов
/ 19 августа 2011

Вам не нужен cat или конвейер для этого; все, что вам нужно, это предоставить файл в качестве стандартного ввода для команды ssh. В оболочке это будет

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'))
...