2

考虑以下示例 -

Python 2.4.3 (#1, Jan 14 2011, 00:20:04)
[GCC 4.1.2 20080704 (Red Hat 4.1.2-48)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> os.system("grep -i beatles blur.txt")
Blur's debut album Leisure (1991) incorporated the sounds of Madchester and shoegazing. Following a stylistic change.influenced by English guitar pop groups such as The Kinks, The Beatles and XTC.
0
>>> os.system("grep -i metallica blur.txt")
256
>>>

因此,在这种情况下,我不希望将搜索关键字的行打印在 Python shell 上,我只想要返回值,即如果关键字存在则返回 0,如果关键字不存在则返回非零。如何做到这一点?

4

3 回答 3

4

您只需要使用-q以下密钥grep

$ python
Python 2.7.3rc2 (default, Apr  5 2012, 18:58:12) 
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> os.system("grep -iq igor /etc/passwd")
0
>>> os.system("grep -iq oleg /etc/passwd")
256
>>> 

我必须注意,-q它不是可移植的密钥grep,它仅适用于 GNU grep(Linux 等)。

当你想让它在所有系统上工作时,你必须使用popen/subprocess.Popen和流的重定向。

>>> import subprocess
>>> null = open(os.devnull, "w")
>>> grep = subprocess.Popen(shlex.split("grep -i oleg /etc/passwd"), stderr = null, stdout = null)
>>> grep.communicate()
(None, None)
>>> print grep.returncode
1
>>> grep = subprocess.Popen(shlex.split("grep -i igor /etc/passwd"), stderr = null, stdout = null)
>>> grep.communicate()
(None, None)
>>> print grep.returncode
0
于 2012-07-09T16:06:58.090 回答
1

Igor Chubin 的答案很好,但在您的情况下,最简单的答案可能只是通过 shell 重定向输出(因为 os.system 无论如何都会调用 shell,您不妨使用它。)

os.system("grep -i beatles blur.txt > /dev/null 2>&1")
于 2012-07-09T16:14:57.467 回答
1

对于“如何防止os.system() 输出被打印”的一般问题,最好的方法是使用subprocess模块,这是运行外部程序的推荐方法,它提供了直接的输出重定向。

这是您的示例的外观:

import os
import subprocess

devnull = open(os.devnull, 'wb')
subprocess.call('grep -i beatles blur.txt', stdout=devnull, stderr=devnull, shell=True)

shell=True选项意味着程序将通过 shell 执行,这就是这样os.system()做的,但最好(更安全)删除shell=True并传递带有命令参数的列表。

subprocess.call(['grep', '-i', 'beatles', 'blur.txt'], stdout=devnull, stderr=devnull)
于 2012-07-09T16:15:39.643 回答