我理解Python是一种动态语言,但下面的代码困扰着我。
我有以下简单的程序,它有一些辅助函数来包装命令执行。
EventLoaderToVerticaHelper是一个带有两个方法的辅助类,所以当我调用“get_filenames_from_hdfs_with_filter”时,它应该抛出一个错误或返回一个String列表。
class EventLoaderToVerticaHelper:
def __init__(self):
pass
@staticmethod
def execute_command(cmd):
p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
error_lines = p.stderr.readlines()
if len(error_lines) > 0:
raise error_lines
return p.stdout.readlines
@staticmethod
def get_filenames_from_hdfs_with_filter(folder, filetype):
cmd = "hdfs dfs -ls {0}/*.{1} | awk '{print $8}'".replace("{0}", folder).replace("{1}", filetype)
return EventLoaderToVerticaHelper.execute_command(cmd)
以下代码使用上面的帮助器
from src.EventLoaderToVerticaHelper import EventLoaderToVerticaHelper
if __name__ == '__main__':
filelist = EventLoaderToVerticaHelper.get_filenames_from_hdfs_with_filter("/user/cloudera/testfiles", "csv")
for s in filelist:
print s
当我运行上述程序时,我得到以下错误。如果List [Str]
,我确定返回类型Traceback (most recent call last):
File "/home/cloudera/PycharmProjects/vertical-event-loader/src/EventLoaderToVertica.py", line 29, in <module>
for s in filelist:
TypeError: 'builtin_function_or_method' object is not iterable
我知道我希望它表现出某种类型的语言...我希望方法返回List [Str],当有异常时我想终止该程序。
我怎样才能做到这一点,我尝试了返回类型和其他东西,但没有运气。
答案 0 :(得分:4)
return p.stdout.readlines
应该是
return p.stdout.readlines()
请注意,当您从stderr读取时,您确实在上面两行正确调用了readlines。