2012-03-25 2 views
0

Я использую subprocess модуль вроде этого:подпроцесс выход на стандартный вывод и PIPE

ping = subprocess.Popen('fping.exe 192.168.2.3 196.65.58.69', stdout=PIPE) 
output = ping.stdout.readlines() 

Я нужен output список для того, чтобы обработать его позже в программе, но, кажется, так как стандартный вывод направляется до PIPE он не выводит результаты на консоль. Я хотел бы получить как консольный вывод (как он выполняется), так и список output.

Как я могу это сделать?

Я выполнил поиск и получил ответ here, но я не могу его реализовать.

Я использую Python 3.x для Windows env.

Спасибо.

+0

Вы всегда можете отобразить вывод в своем скрипте: 'print (output)' –

+0

@LevLevitsky Я хочу получить вывод консоли в качестве выполняемой команды. –

+0

Как насчет ['os.dup2'] (http://docs.python.org/release/3.0.1/library/os.html#file-descriptor-operations), то? –

ответ

0

Я нашел способ сделать это здесь это:

for line in os.popen("Fping x.x.x.x x.x.x.x -l"): 
    ipList.append(line) 
    print(line) 

Таким образом, я могу получить результаты от программы Fping в список, и распечатать его на экране в то время как выполняется, так как цикл for с os.popen не дожидался завершения программы, но всегда выполнялся цикл в каждой строке из программы.

0

Нет такой вещи, как труба, которая идет в два места. Все, записанное в трубу, будет читаться только один раз. (Хотя теоретически возможно, что ваша программа и консоль имеют доступ к одному и тому же выходному каналу, если вам это удастся, тогда только некоторые данные будут отправляться в вашу программу, и только данные, которые не будут включены в консоль.) Чтобы получить весь вывод в вашу программу и на консоль, кому-то придется читать и дублировать данные. В unix-подобной системе вы можете использовать для этого команду «tee», но, вероятно, у вас ее нет на вашей машине Windows.

Таким образом, вам нужно будет написать вывод на консоль, когда вы ее получите.

В этом случае вы, возможно, избежите использования readline() в цикле вместо readlines().