当我从终端手动运行cat file1 | sed 's/v //' | tr -d \\n > file2命令时,它正确地从文件中删除了所有的v,然后删除了所有的换行符。然而,当我从python运行subprocess.run(['/bin/bash', '-ic', "cat file1 | sed 's/v //' | tr -d \\n > file2"])时,它只删除了v,但没有删除换行符。这怎么可能,我该如何解决?
cat file1 | sed 's/v //' | tr -d \\n > file2
subprocess.run(['/bin/bash', '-ic', "cat file1 | sed 's/v //' | tr -d \\n > file2"])
n9vozmp41#
当您在终端中手动运行命令时,它直接在shell中执行,shell管理管道(|)和输出重定向(>),以及像\n这样的转义序列的解释。因此,此命令按预期工作。但是当您使用www.example.com()运行它时subprocess.run,您正在调用一个新的shell进程。此进程以不同的方式解释命令。要获得与在终端中手动运行相同的结果,请使用shell=True在shell环境中运行该命令。
import subprocess subprocess.run("cat file1 | sed 's/v //' | tr -d '\\n' > file2", shell=True)
您还可以使用以下子流程:导入子进程
subprocess.run(['/bin/bash', '-ic', "cat file1 | sed 's/v //' | tr -d '\n' > file2"])
或者,你可以使用Python内置的字符串操作功能,如下所示:
with open('file1', 'r') as infile, open('file2', 'w') as outfile: for line in infile: outfile.write(line.replace('v ', '').strip())
1条答案
按热度按时间n9vozmp41#
当您在终端中手动运行命令时,它直接在shell中执行,shell管理管道(|)和输出重定向(>),以及像\n这样的转义序列的解释。因此,此命令按预期工作。但是当您使用www.example.com()运行它时subprocess.run,您正在调用一个新的shell进程。此进程以不同的方式解释命令。要获得与在终端中手动运行相同的结果,请使用shell=True在shell环境中运行该命令。
您还可以使用以下子流程:导入子进程
或者,你可以使用Python内置的字符串操作功能,如下所示: