您好我试图从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'")
答案 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 } {} $0
和File1.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/##