尝试静音命令时Dos2unix无法正常工作

问题描述 投票:4回答:1

我这样在Python中调用dos2unix:

call("dos2unix " + file1, shell=True, stdout=PIPE)

但是为了使Unix输出静音,我这样做了:

f_null = open(os.devnull, 'w')
call("dos2unix " + file1, shell=True, stdout=f_null , stderr=subprocess.STDOUT)

这似乎不起作用。该命令不再被调用,因为我在file1file2执行的差异(做了一个diff -y file1 file2 | cat -t并且可以看到行结尾没有改变)。

file2是我正在比较file1的文件。它具有Unix行结尾,因为它是在盒子上生成的。但是,file1有可能没有。

python bash dos2unix
1个回答
3
投票

不确定,为什么,但我会试图摆脱你的命令周围的“噪音”并检查返回代码:

check_call(["dos2unix",file1], stdout=f_null , stderr=subprocess.STDOUT)
  • 传递为args列表,而不是命令行(支持包含空格的文件!)
  • 删除shell=True,因为dos2unix不是内置的shell命令
  • 使用check_call所以它引发了一个异常,而不是默默地失败

无论如何,dos2unix可能会检测到输出不再是tty,而是决定将输出转储到其中(dos2unix可以从标准输入到标准输出)。我会接受那个解释。您可以通过重定向到真实文件而不是os.devnull来检查它,并检查结果是否存在。

但我会做一个纯python解决方案(安全备份),它是可移植的,不需要dos2unix命令(因此它也适用于Windows):

with open(file1,"rb") as f:
   contents = f.read().replace(b"\r\n",b"\n")
with open(file1+".bak","wb") as f:
   f.write(contents)
os.remove(file1)
os.rename(file1+".bak",file1)

完全读取文件很快,但可能会扼杀真正的大文件。也可以采用逐行解决方案(仍然使用二进制模式):

with open(file1,"rb") as fr, open(file1+".bak","wb") as fw:
   for l in fr:
      fw.write(l.replace(b"\r\n",b"\n"))
os.remove(file1)
os.rename(file1+".bak",file1)
© www.soinside.com 2019 - 2024. All rights reserved.