使用pipe进行python子进程调用,shell = True无法正常工作

时间:2014-07-30 18:57:57

标签: python bash shell subprocess

我试图从我的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。

1 个答案:

答案 0 :(得分:3)

shell命令中存在竞争条件。管道中的第一个命令是cat file.txt,第二个命令是tr '\r\n' ' ' > file.txt。两个命令同时并行运行。第一个命令从file.txt读取,第二个命令从file.txt读取,然后写入它。如果在第一个命令从文件读取之前发生截断,则该文件将为空。