使用子进程命令循环遍历文件的变量列表时出现TypeError

时间:2016-05-11 21:32:21

标签: python loops subprocess typeerror

作为背景,我创建了一个列表,其中包含不同文件名的元素,其完整路径(/.../filea.dat)名为fileList,长度可变。它的格式为fileList = ['/../filea.dat', '/../fileb.dat']

我想对该文件列表中的每个文件执行一个子进程命令,然后再单独分析每个文件的组件(和生成的新文件)。

for i, elem in enumerate(fileList):
   hexed = fileList[i]
   subprocess.Popen("hexdump " + hexed + " > hexed.dat", shell=True)

   with open("hexed.dat", "r") as f:
      for line in f:
         if "statement" in line:
            value = "examplevalue"
   if value == "examplevalue"
      other subprocess statements that create a file that will again be used later

现在我有TypeError: cannot concatenate 'str' and 'list' objects。让我知道我是否也采用这种方法方法走在正确的轨道上。

如果我需要提供额外的说明,请告诉我。我试图简化基础知识,因为其他细节对问题并不重要。

1 个答案:

答案 0 :(得分:2)

你很亲密。您遇到类型错误,因为Popen要求您在传入字符串而不是列表时也设置shell=True。但是还有另外一个问题:Popen没有等待进程完成,因此当您阅读文件时,它还没有任何有用的东西。另一种策略是跳过文件重定向并直接读取输出流。另请注意,您不需要使用enumerate ... for循环已获取列表中的值。我们可以跳过shell并将命令作为列表传递。

for hexed in fileList:
    proc = subprocess.Popen(["hexdump", hexed], stdout=subprocess.PIPE,
        stderr=open(os.devnull, 'w'))
    for line in proc.stdout:
        if "statement" in line:
            value = "examplevalue"
    proc.wait()
    if proc.returncode != 0:
        print('error') # need less lame error handling!   
    if value == "examplevalue"
        other subprocess statements that create a file that will again be