2011-08-28 80 views
1

我想在shell中执行一个命令并在同一时间管道输出进行过滤。os.system或子进程将命令传递给shell

的培训相关的代码如下所示:

import os 
n=raw_input("enter cmd") 
os.system(n + ' | grep x') 

结果是

Syntax error: Redirection unexpected. 

这是在Ubuntu上,好像在网上提到一些这方面的参考,但没有我可以直接关联。看起来像子进程可能会有帮助,但大多数示例仍然超出了我目前的理解范围。

回答

1

在Ubuntu中,默认shell是dash,这是它给你的错误,如果你用|开始一行,所以我猜你没有在n中放置任何东西。

os.system()现已弃用。 subprocess模块功能更强大,更受欢迎。你将不得不投入一些时间来阅读文档,但它会带来回报。它有一些方便的“便利功能”来减少所需的工作。

+0

TZ,这是非常有帮助的。它帮助我用一些打印语句和理由进行了一些休息。我能够证明输出已经打印到屏幕上了(例如我说的非常新鲜),“| grep x”。我正在同时学习非科学编程和python(就像我说的非常新手一样)。 I – user916843

+0

出于好奇,为什么'os.system()'不推荐使用?看起来它提供了一个非常快速和简单的界面,当你只是想传递一个命令到系统,而不需要花费任何时间来学习如何使用更复杂的'subprocess'模块... – Michael

0

您从shell获取错误,而不是python。您很可能没有输入命令,因此系统调用仅为“| grep x”,这会返回类似的错误。

2

Use subprocess module instead of os.system, which is deprecated

subprocess允许管道和捕获标准输出,只要你想。

process = subprocess.call(command_string.split(), ..., stdout=subprocess.PIPE, ...) 

... handle your output from process.communicate() 
+0

谢谢,我相信它是在这个命令中,我只是有点新而已。我会继续寻找例子,它可能会帮助... – user916843

+0

也有帮助:'shlex.split(command_string)'' –

相关问题