Перевести стандартный файл памяти вывода в строку английского текста, как если бы использовалась команда печати - PullRequest
0 голосов
/ 10 марта 2012

Я запускаю команду поиска для определенного файла, который, как я знаю, существует.Я хотел бы получить путь к этому файлу, потому что я не хочу предполагать, что я знаю, где находится файл.Насколько я понимаю, мне нужно перенаправить стандартный вывод, выполнить команду и записать вывод, повторно подключить стандартный вывод, а затем получить результаты.Проблема возникает, когда я получаю результаты ... Я не могу расшифровать их:

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'

Понятия не имею, что с этим делать.Я хотел что-то вроде того, что предоставляет команда печати:

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

Как сделать этот вывод пригодным для открытия файла?Если я могу получить то, что выводит команда печати, я могу открыть нужный файл.

Пожалуйста, переориентируйте вопрос, если я ошибаюсь.Спасибо!

1 Ответ

2 голосов
/ 10 марта 2012

Вы не можете захватить выходные данные подпроцесса, изменив sys.stdout.Кажется, что вы захватили некоторые escape-последовательности ANSI из вашего интерактивного интерпретатора Python (IPython?).

Чтобы получить вывод внешней команды, вы должны использовать 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"))
...