Python 3.x 通过带有显式引号的子流程发送多个管道命令

Python 3.x 通过带有显式引号的子流程发送多个管道命令,python-3.x,shell,subprocess,pipe,popen,Python 3.x,Shell,Subprocess,Pipe,Popen,我一直试图通过子流程执行管道命令,但遇到了一些问题 我看到了下面提出的解决方案,但没有一个解决了我的问题: - - - 我希望避免使用第三个选项,即shell=True,尽管它确实在我的测试系统上产生了预期的结果。 下面是在Terminal中工作的命令,我想复制它: tr -c "[:alpha:]" " " < some\ file\ name_raw.txt | sed -E "s/ +/ /g" | tr "[:upper:]" "[:lower:]" > clean_in

我一直试图通过
子流程执行管道命令,但遇到了一些问题

我看到了下面提出的解决方案,但没有一个解决了我的问题: - - -

我希望避免使用第三个选项,即
shell=True
,尽管它确实在我的测试系统上产生了预期的结果。

下面是在Terminal中工作的命令,我想复制它:

tr -c "[:alpha:]" " " < some\ file\ name_raw.txt | sed -E "s/ +/ /g" | tr "[:upper:]" "[:lower:]" > clean_in_one_command.txt
然后我会简单地将输出写入一个文本文件,但程序没有完成,因为我收到以下错误:

usage: tr [-Ccsu] string1 string2
       tr [-Ccu] -d string1
       tr [-Ccu] -s string1
       tr [-Ccu] -ds string1 string2
sed: 1: ""s/ +/ /g\"": invalid command code "
usage: tr [-Ccsu] string1 string2
       tr [-Ccu] -d string1
       tr [-Ccu] -s string1
       tr [-Ccu] -ds string1 string2
这表明我的论点没有被正确地传递。似乎
引号都作为
传递到
sed
。我确实需要其中一个。如果我只在列表中放入一个集合,那么它们将在命令中完全剥离,这也会破坏命令

我尝试过的事情:
  • 不为那些需要显式引用的字符串声明文字字符串
  • 转义和双转义显式引用
  • 将整个命令作为一个列表传递到
    subprocess.Popen
    subprocess.run
    函数中
  • 摆弄包装以处理报价
  • 删除部件
    cmd3\u pass\u output=['>']
    cmd3\u outfile=[output\u file\u abs]
    ,以便只处理原始(管道)输出

  • 是我遗漏了什么,还是我将被迫使用
    shell=True

    此程序似乎可以执行您想要的操作。每个进程都必须单独运行。当您构建它们时,其中一个的输出通过管道输出到下一个的输入。这些文件是独立处理的,并在流程的开始和结束时使用

    #! /usr/bin/env python3
    import subprocess
    
    
    def main():
        with open('raw.txt', 'r') as stdin, open('clean.txt', 'w') as stdout:
            step_1 = subprocess.Popen(
                ('tr', '-c', '[:alpha:]', ' '),
                stdin=stdin,
                stdout=subprocess.PIPE
            )
            step_2 = subprocess.Popen(
                ('sed', '-E', 's/ +/ /g'),
                stdin=step_1.stdout,
                stdout=subprocess.PIPE
            )
            step_3 = subprocess.Popen(
                ('tr', '[:upper:]', '[:lower:]'),
                stdin=step_2.stdout,
                stdout=stdout
            )
            step_3.wait()
    
    
    if __name__ == '__main__':
        main()
    

    我的回答有帮助吗?很有魅力——非常聪明的想法是把文件从等式中去掉,让它更像蟒蛇。如果这种方法有任何缺点,我还没有注意到。
    step_3.wait()
    是否只允许在关闭进程之前写入文件?是的,调用
    wait
    可以让
    tr
    在关闭文件之前完成它正在做的事情。
    #! /usr/bin/env python3
    import subprocess
    
    
    def main():
        with open('raw.txt', 'r') as stdin, open('clean.txt', 'w') as stdout:
            step_1 = subprocess.Popen(
                ('tr', '-c', '[:alpha:]', ' '),
                stdin=stdin,
                stdout=subprocess.PIPE
            )
            step_2 = subprocess.Popen(
                ('sed', '-E', 's/ +/ /g'),
                stdin=step_1.stdout,
                stdout=subprocess.PIPE
            )
            step_3 = subprocess.Popen(
                ('tr', '[:upper:]', '[:lower:]'),
                stdin=step_2.stdout,
                stdout=stdout
            )
            step_3.wait()
    
    
    if __name__ == '__main__':
        main()