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