我试图从我的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)
该文件最终为空,而不是像我期望的那样成功删除换行符。
我向this post咨询了类似的问题,但解决方法是使用我已经使用的shell = True,重定向使Popen更复杂。此外,我不明白为什么它不适用于shell = True。
答案 0 :(得分:3)
shell命令中存在竞争条件。管道中的第一个命令是cat file.txt
,第二个命令是tr '\r\n' ' ' > file.txt
。两个命令同时并行运行。第一个命令从file.txt
读取,第二个命令从file.txt
读取,然后写入它。如果在第一个命令从文件读取之前发生截断,则该文件将为空。