使用管道调用python子流程,shell=True不工作

使用管道调用python子流程,shell=True不工作,python,bash,shell,subprocess,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 t

我试图从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一起工作。

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

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

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

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

你为什么要用这个?在shell管道中尝试执行的操作在Python中也一样简单…当我直接从bash shell中执行时,这实际上会导致一个空文件。你是对的。。。我完全可以换一个电话。然而,现在我只是好奇为什么它不起作用,所以我会继续问这个问题。@taronish4:dano是对的。问题是您的
tr
调用是错误的,无论是从shell还是从Python;这与您使用
子流程
无关。另外,作为旁注:您应该考虑使用
str.format
%
而不是串联,尤其是当您到处都有这样的引号时。原始字符串可能也会有所帮助。例如,这不是更具可读性(而且更明显是正确的)吗
r“cat{}|tr'\r\n'>{}.format(fileName,fileName)
为什么要首先使用这个?在shell管道中尝试执行的操作在Python中也一样简单…当我直接从bash shell中执行时,这实际上会导致一个空文件。你是对的。。。我完全可以换一个电话。然而,现在我只是好奇为什么它不起作用,所以我会继续问这个问题。@taronish4:dano是对的。问题是您的
tr
调用是错误的,无论是从shell还是从Python;这与您使用
子流程
无关。另外,作为旁注:您应该考虑使用
str.format
%
而不是串联,尤其是当您到处都有这样的引号时。原始字符串可能也会有所帮助。例如,这不是更具可读性(而且更明显是正确的)吗
r“cat{}|tr'\r\n'>{}.format(fileName,fileName)
为什么要首先使用这个?在shell管道中尝试执行的操作在Python中也一样简单…当我直接从bash shell中执行时,这实际上会导致一个空文件。你是对的。。。我完全可以换一个电话。然而,现在我只是好奇为什么它不起作用,所以我会继续问这个问题。@taronish4:dano是对的。问题是您的
tr
调用是错误的,无论是从shell还是从Python;这与您使用
子流程
无关。另外,作为旁注:您应该考虑使用
str.format
%
而不是串联,尤其是当您到处都有这样的引号时。原始字符串可能也会有所帮助。例如,这不是更具可读性(而且更明显是正确的)吗
r“cat{}|tr'\r\n'>{}.format(fileName,fileName)
为什么要首先使用这个?在shell管道中尝试执行的操作在Python中也一样简单…当我直接从bash shell中执行时,这实际上会导致一个空文件。你是对的。。。我完全可以换一个电话。然而,现在我只是好奇为什么它不起作用,所以我会继续问这个问题。@taronish4:dano是对的。问题是您的
tr
调用是错误的,无论是从shell还是从Python;这与您使用
子流程
无关。另外,作为旁注:您应该考虑使用
str.format
%
而不是串联,尤其是当您到处都有这样的引号时。原始字符串可能也会有所帮助。例如,这不是更具可读性(而且更明显是正确的)吗<代码>r“cat{}|tr'\r\n''