未检测到Python subprocess.call参数

时间:2014-11-05 09:09:25

标签: python

我有一个脚本可以使用Hadoop CLI将文件上传到HDFS

以下是摘录:

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 个答案:

答案 0 :(得分: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,因为这是检查错误的简便方法。

答案 1 :(得分:1)

您正在滥用shell = True选项。

如果为True,则命令按原样传递给shell。您无需将其分解为列表。

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)

或者如果你想让参数作为列表,那么你将不得不放弃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]
         , stderr=STDOUT)