shell 终端中的tr bash命令有效,但从python调用时无效

0mkxixxg  于 12个月前  发布在  Shell
关注(0)|答案(1)|浏览(134)

当我从终端手动运行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,但没有删除换行符。这怎么可能,我该如何解决?

n9vozmp4

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())

相关问题