我希望使用从bash函数返回值到例如grep的重定向,并从python调用它。
尽管我在子进程中使用shell=True,但这似乎不起作用。
在bash:中工作的示例
grep foo <(echo "fooline")
在python3.7.3中给出错误/bin/sh: 1: Syntax error: "(" unexpected的示例,Ubuntu19.04:
#!/usr/bin/env python3
import subprocess
subprocess.call('grep foo <(echo "fooline")', shell=True)根据these这样的答案,重定向应该与shell=True一起工作(它用于重定向实际文件,而不是返回值)。
编辑:添加了shebang和python版本。
发布于 2019-07-29 11:30:49
您所观察到的不一致性是由于shell=True为您提供了一个sh外壳,而不是bash。
以下内容在bash中有效,但在sh中无效。
grep foo <(echo "fooline")示例输出:
sh-3.2$ grep foo <(echo "fooline")
sh: syntax error near unexpected token `('如果您使用有效的sh表达式,则您的方法将有效。或者,您可以指定在executable='/bin/bash'中使用哪个shell。您还可以使用以下内容:
subprocess.Popen(['/bin/bash', '-c', cmd])发布于 2019-07-29 08:41:23
这个错误是一个shell错误,与python无关。sh阻塞了python语法的括号。
/bin/sh: 1:语法错误:"(“意外”
让我们添加一个shebang (参考:Should I put #! (shebang) in Python scripts, and what form should it take?)
同时也停止使用shell=True和all。使用带有参数的真实管道和命令行(注意:这已经过测试&使用本机grep命令在windows上工作,因此现在这是可移植的)
#!/usr/bin/env python3
import subprocess
p = subprocess.Popen(['grep','foo'],stdin = subprocess.PIPE)
p.stdin.write(b"fooline\n")
p.stdin.close()
p.wait()https://stackoverflow.com/questions/57249913
复制相似问题