如何从python中管道许多bash命令?

时间:2017-05-05 20:02:38

标签: python bash subprocess pipe

您好我试图从python调用以下命令:

    <SVGImage
      showWebviewLoader={false}
      style={{ width: 80, height: 80 }}
      source={{uri:'https://fluent-panda.appspot.com.storage.googleapis.com/dumbbell.svg'}}
    />

当comm命令的输入也被管道传输时,我怎么能进行调用?

有一种简单直接的方法吗?

我尝试了子进程模块:

comm -3 <(awk '{print $1}' File1.txt | sort | uniq) <(awk '{print $1}' File2.txt | sort | uniq) | grep -v "#" | sed "s/\t//g"

没有成功,它说: OSError:[Errno 2]没有这样的文件或目录

或者我是否必须单独创建不同的调用,然后使用PIPE传递它们,如子进程文档中所述:

subprocess.call("comm -3 <(awk '{print $1}' File1.txt | sort | uniq) <(awk '{print $1}' File2.txt | sort | uniq) | grep -v '#' | sed 's/\t//g'")

1 个答案:

答案 0 :(得分:7)

进程替换(click)是仅限bash的功能。因此,您需要一个shell,但它不能只是任何shell(如<(),在非Windows平台上由/bin/sh使用) - 它必须是 bash

shell=True

顺便说一句,如果您要使用任意文件名转到此路线,请将其传递到带外(如下所示:将subprocess.call(['bash', '-c', "comm -3 <(awk '{print $1}' File1.txt | sort | uniq) <(awk '{print $1}' File2.txt | sort | uniq) | grep -v '#' | sed 's/\t//g'"]) 作为_传递,{{1 } {} $0File1.txt $1}:

File2.txt

尽管如此,最佳实践方法确实是自己建立链条。下面是用Python 3.6测试的(请注意$2 subprocess.call(['bash', '-c', '''comm -3 <(awk '{print $1}' "$1" | sort | uniq) ''' ''' <(awk '{print $1}' "$2" | sort | uniq) ''' ''' | grep -v '#' | tr -d "\t"''', '_', "File1.txt", "File2.txt"]) 参数需要通过pass_fds链接提供文件描述符:

subprocess.Popen

这是更多的代码,但(假设文件名在现实世界中被参数化)它也是更安全的代码 - 你不容易受到像ShellShock由启动shell的简单行为触发,并且不需要担心带外传递变量以避免注入攻击(除了命令参数的上下文之外 - 如{{1} - 那是脚本语言解释器本身。)

那就是说,另一件要考虑的事情就是在原生Python中实现整个事情。

/dev/fd/##