我在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)
这似乎不起作用。该命令不再被调用,因为我在file1
上针对file2
执行了差异(执行了diff -y file1 file2 | cat -t
并且可以看到行结尾没有改变)
file2
是我正在比较file1
的文件。它具有Unix行结尾,因为它是在盒子上生成的。但是,file1
可能没有。{1}}。
答案 0 :(得分:3)
不确定,为什么,但我会试图摆脱"噪音"围绕你的命令&检查返回码:
check_call(["dos2unix",file1], stdout=f_null , stderr=subprocess.STDOUT)
shell=True
,因为dos2unix
不是内置的shell命令check_call
因此它会引发异常,而不是静默失败无论如何,dos2unix
可能会检测到输出不再存在,并决定将输出转储到其中(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)