【发布时间】:2018-05-11 01:39:15
【问题描述】:
从命令行调用程序时,我可以将输出通过管道传输到grep 以选择我想查看的行,例如
printf "hello\ngood day\nfarewell\n" | grep day
我正在寻找相同类型的行选择,但寻找从 Python 调用的 C 库。考虑以下示例:
import os
# Function which emulate a C library call
def call_library():
os.system('printf "hello\ngood day\nfarewell\n"')
# Pure Python stuff
print('hello from Python')
# C library stuff
call_library()
运行此 Python 代码时,我希望 C 部分的输出为字符串 'day' 的 grep'ed,从而使代码输出
来自 Python 的你好
美好的一天
到目前为止,我已经使用here 和here 描述的方法摆弄了stdout 的重定向。我能够使 C 输出完全消失,或者将其保存到 str 并稍后打印出来(这是两个链接主要关注的内容)。但是,我无法根据内容选择打印哪些行。重要的是,我希望在调用 C 库时实时输出,所以我不能只是将stdout 重定向到某个缓冲区并在事后对该缓冲区进行一些处理。
该解决方案只需要在 Linux 上使用 Python 3.x。如果除了行selection之外,该解决方案还可以进行行编辑,那就更好了。
我觉得应该可以,但是不知道怎么设置
将
stdout重定向到内存中的“文件”。生成一个新线程,该线程不断从该文件中读取,根据行内容进行选择,并将想要的行写入屏幕,即
stdout的原始目的地。调用 C 库
将两个线程重新连接在一起并将
stdout重定向回其原始目标(屏幕)。
我对文件描述符之类的掌握不够牢固,无法做到这一点,甚至不知道这是否是最好的方法。
编辑
请注意,该解决方案不能简单地重新实现call_library 中的代码。代码必须调用call_library,与实际执行的代码完全无关。
【问题讨论】:
-
是否有理由不能将所有输出捕获到 Python 字符串中,然后
split()它并提取匹配行? (对于这种情况,大量的输出显然会破坏交易。) -
嗯,你会怎么做呢?请记住,我希望在调用库的 Python 会话中完成行选择。将所有输出通过管道传输到执行
grep'ing 的新 Python 会话不是一种选择。如果您认为自己有解决方案,请分享。 -
您链接到的 Stack Overflow 问题有一个
StringIO包装器,用于将标准输出捕获到变量中。 -
是的,我确实可以让它发挥作用。但我怎样才能更进一步,实现我想要的呢?
-
可以说,如果库不允许您将其结果捕获到内存缓冲区,则该库已损坏。顺便说一句,我遇到了这个模糊相关的问题:stackoverflow.com/questions/47381835/…
标签: python c linux python-3.x grep