【问题标题】:Using grep from python console从 python 控制台使用 grep
【发布时间】:2014-05-22 05:40:20
【问题描述】:

使用 python 我怎样才能做到这一点?

python_shell$>  print myPhone.print_call_log()  |  grep 555

我看到的唯一接近的是使用“ipython 控制台”,将输出分配给一个变量,然后对该变量使用 .grep() 函数。这不是我真正想要的。我想要管道和 grepping 输出中的任何内容(包括错误/信息)。

【问题讨论】:

  • 长期使用Python交互控制台作为shell环境是错误的。用它来测试 Python 语句;试图将它用作通用外壳会招致无数这样的挫败感。
  • 使用re在python中进行模式匹配或将日志写入临时文件以使用grep
  • ipython 可以处理来自 shell/系统命令的 grepping 输出。 Example post 来自 ipython 的文档。我希望有人将这种能力弯曲到更容易利用,而不仅限于对象的内容。

标签: python grep pipe ipython


【解决方案1】:

Python 的交互式 REPL 没有grep,也没有进程管道,因为它不是 Unix shell。您需要使用 Python 对象。

所以,假设myPhone.print_call_log的返回值是一个序列:

call_log_entries = myPhone.print_call_log()
entries_containing_555 = [
        entry for entry in call_log_entries
        if "555" in entry]

【讨论】:

  • 我认为 'myPhone.print_call_log()' 是一个'\n' 分隔的字符串,可以使用split('\n') 将其转换为序列。
【解决方案2】:

这样的事情怎么样。

import subprocess
results = subprocess.check_output('cat /path/to/call_log.txt | grep 555', shell=True)
print(results)

或者:

import subprocess
string = myPhone.print_call_log().replace("\'","\\'")
results = subprocess.check_output('echo \''+string+'\' | grep 555', shell=True)
print(results)

如果不知道 myPhone.print_call_log() 的返回类型是什么,很难判断。它是一个生成器,还是返回一个列表?还是字符串?

相关问题:

文档:

编辑:

根据glglgl的评论

glglgl 写的这样的东西可能更合适:

【讨论】:

  • 而不是results = subprocess.check_output('echo \''+myPhone.print_call_log()+'\' | grep 555', shell=True)stdin=stubprocess.PIPE.communicate() 的组合会更合适......但是,您可以完全省略子流程并自行执行搜索。跨度>
  • 顺便说一句,如果您的' 输出中有',您会怎么做?如果你用'\'' 替换它们,你应该没问题。但是“优雅”这个词不太合适……
  • 感谢您的提醒。哈哈。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-06-27
  • 1970-01-01
  • 2014-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-22
相关资源
最近更新 更多