尝试静音命令时 Dos2unix 不工作

Dos2unix not working when trying to silence command

我是这样从 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 有可能不会。

不确定,为什么,但我会尝试摆脱您命令周围的 "noise" 并检查 return 代码:

check_call(["dos2unix",file1], stdout=f_null , stderr=subprocess.STDOUT)
  • 作为参数列表传递,而不是命令行(支持其中包含空格的文件!)
  • 删除 shell=True 因为 dos2unix 不是 built-in 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)

完整读取文件速度很快,但读取非常大的文件时可能会卡住。 line-by-line 解决方案也是可以的(仍然使用二进制模式):

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)