2014-11-05 53 views
0

我有一个脚本伟驰弹了使用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中运行。你可以简单地删除shell=True和修复你的命令了一下:

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

我改成了使用check_call,因为这是最简单的方式来检查错误。

+0

现在我得到这个错误:'''FileNotFoundError:[错误2]没有这样的文件或目录: '/usr/local/hadoop-2.5.1/bin/hadoop FS -put' ''' – Lee 2014-11-05 09:31:13

+0

它确实存在,但:(VENV)的bash-4.1#/usr/local/hadoop-2.5 .1/bin/hadoop fs -put -put:没有足够的参数:预计1但得到0 用法:hadoop fs [通用选项] -put [-f] [-p] ... Lee 2014-11-05 09:31:54

+0

@JohnDoe:我认为你忽视了像我一样分裂命令。请仔细阅读我的答案,并与您的代码进行比较。 – 2014-11-05 09:32:44

1

您正在误用shell = 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)