将标准输出存储器文件转换为英文文本字符串,就像正在使用打印命令一样

时间:2012-03-10 18:33:26

标签: python unix find stdout stringio

我正在为我知道存在的特定文件运行find命令。我想获取该文件的路径,因为我不想假设我知道文件的位置。我的理解是我需要重定向stdout,运行命令并捕获输出,重新连接标准输出,然后检索结果。检索结果时会出现问题...我无法解读它们:

import os
from cStringIO import StringIO
stdout_backup = sys.stdout #Backup standard output
stdout_output = StringIO() 
sys.stdout = stdout_output #Redirect standard output
os.system("find . -name 'foobar.ext' -print") #Find a known file
sys.stdout = stdout_backup #re-hook-up standard output as top priority
paths_to_file = stdout_ouput.get_value() #Retrieve results

我找到了我想要的所有路径,麻烦的是paths_to_file产生了这个:

Out[9]: '\n\x01\x1b[0;32m\x02In [\x01\x1b[1;32m\x027\x01\x1b[0;32m\x02]: \x01\x1b[0m\x02\n\x01\x1b[0;32m\x02In [\x01\x1b[1;32m\x028\x01\x1b[0;32m\x02]: \x01\x1b[0m\x02'

我不知道该怎么做。我想要的是类似于print命令提供的内容:

./Work/Halpin Programs/Servers/selenium-server.jar

如何使该输出可用于打开文件?如果我能得到print命令,我可以打开我想要的文件。

如果我被误导,请重新调整问题的方向。谢谢!

1 个答案:

答案 0 :(得分:2)

您无法通过更改sys.stdout来捕获子流程的输出。您捕获的内容似乎是来自交互式Python解释器(IPython?)的一些ANSI转义序列。

要获取外部命令的输出,您应该使用subprocess.check_output()

paths = subprocess.check_output(["find", ".", "-name", "foobar.ext"])

在这种特殊情况下,我通常根本不会调用外部命令,而是使用os.walk()从Python进程中直接找到文件。

修改:以下是使用os.walk()查找文件的方法:

def find(path, pattern):
    for root, dirs, files in os.walk(path):
        for match in fnmatch.filter(files, pattern):
            yield os.path.join(root, match)

paths = list(find(".", "foobar.ext"))