python subprocess调用管道时,shell=True不起作用
我正在尝试从我的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
清空,然后再写入内容。如果第二个命令在第一个命令读取文件之前就把文件清空了,那么第一个命令读取到的就是空文件。