尝试静音命令时 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)
这似乎不起作用。该命令不再被调用,因为我在 file1
和 file2
上执行的差异(做了 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)
我是这样从 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
有可能不会。
不确定,为什么,但我会尝试摆脱您命令周围的 "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)