gpt4 book ai didi

python - 尝试静音命令时 Dos2unix 不工作

转载 作者:太空宇宙 更新时间:2023-11-03 10:51:24 24 4
gpt4 key购买 nike

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

最佳答案

不确定,但我会尝试消除命令周围的“噪音”并检查返回码:

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

关于python - 尝试静音命令时 Dos2unix 不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49729099/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com