如何在Python中通过运行Linux命令修复“尾巴:写入错误:管道破裂”?

时间:2019-05-05 10:48:23

标签: python bash

我试图逐行打印列表中的每个文件。 在文件的每一行的末尾,它需要检查术语“ .sh”是否在其中。

我遇到错误

  

“尾巴:写入错误:“管道破损”

预期结果:

  1. 从列表中读取每个
  2. 检查文件的每一行是否在文件行的末尾添加了“ .sh”一词。
  3. 打印是否找到“ .sh”

这是我的atm:

# Modules
import os
from pprint import pprint

# Files in list
dirlist = ['test.txt','test2.txt','test3.txt']

# Loop to read the file in list
for x in range (len(dirlist)):
    print ("Output of Filename: " + dirlist[x]

# Variable to save the last 3 characters of the line
last3 = os.popen ("cat " + dirlist[x] + " | tail -c 3")
print last3

# Read file
f = open(dirlist[x], "r")
# Loop to check if the keyword is the same as last3
for l in f:
    if last3 in l:
        print ("FOUND IT!")

    else:
        print ("NOT IN IT!")

结果: enter image description here

@Nic

enter image description here

[![在此处输入图片描述] [3]] [3]

4 个答案:

答案 0 :(得分:2)

我建议您将环境与本机python代码一起使用,而不要使用open和os.popen

这是一个例子

# Files in list
dirlist = ['test.txt','test2.txt','test3.txt']

# Loop to read the file in list
for x in dirlist:
    print ("Output of Filename: " + x)
    with open(x) as f
        lines=f.readlines()
        for line in lines: #here you print each line
            print (line)

        if '.sh' in lines[-1:]: #check if .sh is in the last line
            print("found it")
        else:
            print("didnt find it")

答案 1 :(得分:1)

答案 2 :(得分:1)

tail(实际上是stdio)在尝试写入输出时出现“断管”错误,但周围没有人可以读取它。 (更具体地说,当它收到SIGPIPE时。)

如果您要使用popen启动子进程,则需要在程序退出之前完成从管道的读取。

在您的情况下,您应该使用subprocess.run而不是裸露的os.popen

或者更好的是,不要将子进程用于简单的文件操作!只需使用本机Python代码进行处理,就会更加简单。

答案 3 :(得分:-1)

在@Nic Wanavit和Daniel Pyrden的帮助下,我终于修复了它。

我已将 if / else 放入循环内,否则它将检查所有行中的.sh而不是每行。

并且我已经在“。sh” 部分中添加了括号,并且可以正常工作!

但是,我没有在最后3个字符中使用它,因为-1:由于某种原因对我不起作用。

# Files in List
dirlist = ['test.txt', 'test2.txt', 'test3.txt']

# Loop to read the file in list
for x in dirlist:
 print ("Output of filename: "+  x)

 with open(x) as f:
  lines = f.readlines()
  for line lines:
   print ("Line in file: " + line)

   if (".sh" in line):
    print ("FOUND IT")

   else:
    print ("not found it \n")

结果

enter image description here