python subprocess调用管道时,shell=True不起作用

0 投票
1 回答
580 浏览
提问于 2025-04-18 15:23

我正在尝试从我的Python脚本中调用一个子进程,目的是把文件中的回车和换行符替换成空格,然后再把结果保存回原文件。我已经验证过这个方法是有效的:

cat file.txt | tr '\r\n' ' ' > file.txt

所以我也想在Python中做同样的事情。我的调用看起来是这样的:

formatCommand = "cat " + fileName + " | tr '\\r\\n' ' ' > " + fileName
print(formatCommand)    #this showed me that the command above is being passed
subprocess.call(formatCommand, shell=True)

但结果并没有像我预期的那样成功删除换行符,反而文件变成了空的。

我查阅了这篇关于类似问题的帖子,但里面的解决方案是使用shell=True,而我已经在用了,而且重定向让Popen变得更复杂。此外,我也不明白为什么在使用shell=True时它就不工作。

1 个回答

3

你的命令行中出现了竞争条件。你管道中的第一个命令是 cat file.txt,第二个命令是 tr '\r\n' ' ' > file.txt。这两个命令是同时运行的。第一个命令从 file.txt 中读取内容,而第二个命令则是先把 file.txt 清空,然后再写入内容。如果第二个命令在第一个命令读取文件之前就把文件清空了,那么第一个命令读取到的就是空文件。

撰写回答