Как зайти в Даркнет?!
25th January, 01:11
8
0
Как в tkinter из поля ввода Entry получить значение в одну переменную и обновить строку кнопкой, затем получить ещё одно введённое значение и затем сложить их. Ниже пример кода
21st July, 19:00
901
0
Программа, которая создает фейковые сервера в поиске игровых серверов CS 1.6 Steam
21st March, 17:43
952
0
Очень долго работает Update запрос Oracle
27th January, 09:58
916
0
не могу запустить сервер на tomcat HTTP Status 404 – Not Found
21st January, 18:02
907
0
Где можно найти фрилансера для выполнения поступающих задач, на постоянной основе?
2nd December, 09:48
942
0
Разработка мобильной кроссплатформенной военной игры
16th July, 17:57
1727
0
период по дням
25th October, 10:44
3957
0
Пишу скрипты для BAS только на запросах
16th September, 02:42
3722
0
Некорректный скрипт для закрытия блока
14th April, 18:33
4614
0
прокидывать exception в блоках try-catch JAVA
11th March, 21:11
4382
0
Помогите пожалуйста решить задачи
24th November, 23:53
6089
0
Не понимаю почему не открывается детальное описание продукта
11th November, 11:51
4352
0
Нужно решить задачу по программированию на массивы
27th October, 18:01
4401
0
Метода Крамера С++
23rd October, 11:55
4309
0
помогите решить задачу на C++
22nd October, 17:31
4002
0
Помогите решить задачу на python с codeforces
22nd October, 11:11
4492
0
Python с нуля: полное руководство для начинающих
18th June, 13:58
2599
0
Как захватить выходные данные интерпретатора Python и/или CMD.EXE's из сценария Python?
- Можно ли захватить выходные данные интерпретатора Python из скрипта Python?
- Можно ли захватить выходные данные Windows CMD из сценария Python?
Если да, то в какую библиотеку(y|ies) мне следует заглянуть?
Если вы говорите о интерпретаторе python или CMD.exe, который является 'parent' вашего сценария, то нет, это невозможно. В каждой POSIX-подобной системе (теперь вы работаете с Windows, кажется, и это может иметь какую-то странность, о которой я не знаю, YMMV) каждый процесс имеет три потока, стандартный ввод, стандартный вывод и стандартную ошибку. По умолчанию (при запуске в консоли) они направляются на консоль, но перенаправление возможно с помощью нотации канала:
python script_a.py | python script_b.py
Это связывает стандартный выходной поток скрипта a со стандартным входным потоком скрипта B. Стандартная ошибка по-прежнему передается в консоль в этом примере. Смотрите статью о стандартных потоках в Википедии.
Если вы говорите о дочернем процессе, вы можете запустить его из python примерно так (stdin также является опцией, если вы хотите двустороннюю связь):
import subprocess
# Of course you can open things other than python here :)
process = subprocess.Popen(["python", "main.py"], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
x = process.stderr.readline()
y = process.stdout.readline()
process.wait()
См. модуль подпроцесса Python для получения информации об управлении процессом. Для связи каналы process.stdin и process.stdout считаются стандартными файловыми объектами .
Для использования с трубами, чтение из стандартного ввода, как предложил лассевк, вы бы сделали что - то вроде этого:
import sys
x = sys.stderr.readline()
y = sys.stdin.readline()
sys.stdin и sys.stdout-это стандартные файловые объекты, как было отмечено выше, определенные в модуле sys . Возможно, вы также захотите взглянуть на модуль труб .
Чтение данных с помощью readline(), как и в моем примере, является довольно наивным способом получения данных. Если вывод не является линейно-ориентированным или индетерминированным, вы, вероятно, захотите посмотреть на опрос , который, к сожалению, не работает в windows, но я уверен, что там есть какая-то альтернатива.
Я думаю, что могу указать вам хороший ответ на первую часть вашего вопроса.
1. Is это возможно, чтобы захватить выход Python переводчик с Python сценарий?
Ответ "да", и лично мне нравится следующее, взятое из примеров в PEP 343 -- документе заявления "with" .
from contextlib import contextmanager
import sys
@contextmanager
def stdout_redirected(new_stdout):
saved_stdout = sys.stdout
sys.stdout = new_stdout
try:
yield None
finally:
sys.stdout.close()
sys.stdout = saved_stdout
И используется вот так:
with stdout_redirected(open("filename.txt", "w")):
print "Hello world"
Хорошим аспектом этого является то, что он может быть применен выборочно только к части выполнения скрипта, а не ко всему его экстенту, и остается в силе даже тогда, когда необработанные исключения возникают в его контексте. Если вы повторно откроете файл в режиме добавления после его первого использования, вы можете собрать результаты в один файл:
with stdout_redirected(open("filename.txt", "w")):
print "Hello world"
print "screen only output again"
with stdout_redirected(open("filename.txt", "a")):
print "Hello world2"
Конечно, вышеизложенное также может быть расширено, чтобы также перенаправить sys.stderr в тот же или другой файл. Также смотрите этот ответ на соответствующий вопрос.
На самом деле, вы определенно можете, и это красиво, уродливо и безумно одновременно!
Можно заменить sys.stdout и sys.stderr объектами StringIO, которые собирают выходные данные.
Вот пример, сохраните его как evil.py:
import sys
import StringIO
s = StringIO.StringIO()
sys.stdout = s
print "hey, this isn't going to stdout at all!"
print "where is it ?"
sys.stderr.write('It actually went to a StringIO object, I will show you now:\n')
sys.stderr.write(s.getvalue())
Когда вы запустите эту программу, вы увидите, что:
- ничего не пошло в stdout (где обычно печатается print to)
- первая строка, которая записывается в stderr, начинается с 'It'
- следующие две строки-это те, которые были собраны в объекте StringIO
Замена sys.stdout/err подобным образом-это приложение того, что называется monkeypatching. Мнения могут различаться, является ли это 'supported', и это определенно уродливый хак, но он спас мой бекон, когда пытался обернуть вокруг внешнего материала один или два раза.
Тестировался на Linux, а не на Windows, но он должен работать так же хорошо. Дайте мне знать, если он работает на Windows!
В каком контексте вы спрашиваете?
Вы пытаетесь захватить выходные данные из программы, которую вы запускаете в командной строке?
если да, то вот как его выполнить:
somescript.py | your-capture-program-here
а чтобы прочитать вывод, просто считайте со стандартного входа.
Если, с другой стороны, вы выполняете этот скрипт или cmd.exe или аналогичный из своей программы и хотите дождаться, пока скрипт/программа завершится, и захватить все его выходные данные, то вам нужно посмотреть на вызовы библиотеки, которые вы используете для запуска этой внешней программы, скорее всего, есть способ попросить ее дать вам какой-то способ прочитать выходные данные и дождаться завершения.