首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在python中使用重定向运行bash命令

在python中使用重定向运行bash命令
EN

Stack Overflow用户
提问于 2019-07-29 08:31:00
回答 2查看 395关注 0票数 1

我希望使用从bash函数返回值到例如grep的重定向,并从python调用它。

尽管我在子进程中使用shell=True,但这似乎不起作用。

在bash:中工作的示例

grep foo <(echo "fooline")

在python3.7.3中给出错误/bin/sh: 1: Syntax error: "(" unexpected示例,Ubuntu19.04:

代码语言:javascript
复制
#!/usr/bin/env python3
import subprocess
subprocess.call('grep foo <(echo "fooline")', shell=True)

根据these这样的答案,重定向应该与shell=True一起工作(它用于重定向实际文件,而不是返回值)。

编辑:添加了shebang和python版本。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-07-29 11:30:49

您所观察到的不一致性是由于shell=True为您提供了一个sh外壳,而不是bash

以下内容在bash中有效,但在sh中无效。

代码语言:javascript
复制
grep foo <(echo "fooline")

示例输出:

代码语言:javascript
复制
sh-3.2$ grep foo <(echo "fooline")
sh: syntax error near unexpected token `('

如果您使用有效的sh表达式,则您的方法将有效。或者,您可以指定在executable='/bin/bash'中使用哪个shell。您还可以使用以下内容:

代码语言:javascript
复制
subprocess.Popen(['/bin/bash', '-c', cmd])
票数 2
EN

Stack Overflow用户

发布于 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上工作,因此现在这是可移植的)

代码语言:javascript
复制
#!/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()
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57249913

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档