2014-11-05 2 views
0

У меня есть сценарий whichs выкладывает использовать Hadoop CLI, чтобы загрузить файл в HDFSPython subprocess.call аргументы не будучи обнаруженным

Вот фрагмент кода:

def hdfs_put(file_path, topic): 
    print(file_path) 
    print(topic) 
    call(["/usr/local/hadoop-2.5.1/bin/hadoop fs -put", file_path, "/" + topic] 
     , shell=True 
     , stderr=STDOUT) 

Вот что я получаю (обратите внимание на аргументы не нуль):

avro/hdfs_1_2014-11-05.avro 
hdfs 
-put: Not enough arguments: expected 1 but got 0 
Usage: hadoop fs [generic options] -put [-f] [-p] <localsrc> ... <dst> 

ответ

2

Когда shell=True, то args должен содержать одну строку для запуска в оболочке. Вы можете просто удалить shell=True и исправить ваша команда немного:

check_call(["/usr/local/hadoop-2.5.1/bin/hadoop", "fs", "-put", file_path, "/" + topic] 
    , stderr=STDOUT) 

Я изменил его использовать check_call, потому что это простой способ проверить на наличие ошибок.

+0

теперь я получаю эту ошибку: '' 'FileNotFoundError: [Errno 2] Нет такого файла или каталога: '/usr/local/hadoop-2.5.1/bin/hadoop fs -put' '' ' – Lee

+0

Он существует, хотя: (venv) bash-4.1 # /usr/local/hadoop-2.5 .1/bin/hadoop fs -put -put: Недостаточно аргументов: ожидается 1, но получено 0 Использование: hadoop fs [generic options] -put [-f] [-p] ... Lee

+0

@JohnDoe: Я думаю, вы пренебрегли, чтобы разделить команду, как я. Пожалуйста, внимательно прочитайте мой ответ и сравните с вашим кодом. –

1

Вы неправильно используете оболочку = True.

Когда True, команда передается в оболочку как есть. Вам не нужно разбивать его на список.

def hdfs_put(file_path, topic): 
    print(file_path) 
    print(topic) 
    call("/usr/local/hadoop-2.5.1/bin/hadoop fs -put " + file_path + " /" + topic 
      , shell=True 
      , stderr=STDOUT) 

Или, если вы хотите, чтобы иметь аргументы в виде списка, то вам придется отказаться от Шелл = True:

def hdfs_put(file_path, topic): 
    print(file_path) 
    print(topic) 
    call(["/usr/local/hadoop-2.5.1/bin/hadoop", "fs", "-put", file_path, "/" + topic] 
     , stderr=STDOUT) 
Смежные вопросы