python - строки - как запустить файл py




Как захватить вывод интерпретатора Python и/или CMD.EXE из сценария Python? (4)

В каком контексте вы спрашиваете?

Вы пытаетесь захватить вывод из программы, которую вы запускаете в командной строке?

если это так, то вот как это выполнить:

somescript.py | your-capture-program-here

и читать результат, просто прочитав стандартный ввод.

Если, с другой стороны, вы выполняете этот скрипт или cmd.exe или подобное из вашей программы и хотите дождаться завершения скрипта / программы и захватить весь его вывод, вам нужно посмотреть на библиотеку звонки, которые вы используете для запуска этой внешней программы, скорее всего, есть способ попросить ее дать вам некоторый способ прочитать результат и дождаться завершения.

  1. Можно ли захватить вывод интерпретатора Python из сценария Python?
  2. Можно ли захватить вывод CMD Windows из сценария Python?

Если да, то в каком либраре (y | ies) я должен смотреть?


Вы хотите подпроцесс . Посмотрите конкретно на Попена в 17.1.1 и сообщите в 17.1.2.


Думаю, я могу указать на хороший ответ для первой части вашего вопроса.

1. Можно ли захватить вывод интерпретатора Python из сценария Python?

Ответ « да », и мне лично нравится следующее, снятое с примеров в PEP 343 - «с» документом Statement .

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 в тот же или другой файл. Также см. Ответ на соответствующий вопрос.


Если вы говорите о интерпретаторе python или CMD.exe, который является «родителем» вашего скрипта, тогда нет, это невозможно. В каждой POSIX-подобной системе (теперь вы работаете под Windows, похоже, и это может иметь некоторые особенности, о которых я не знаю, YMMV). Каждый процесс имеет три потока, стандартный ввод, стандартный вывод и стандартную ошибку. Bu по умолчанию (при запуске в консоли) они направлены на консоль, но перенаправление возможно с использованием нотации канала:

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 считаются стандартными файловыми объектами .

Для использования с трубами чтение со стандартного ввода, так как lassevk предположил, что вы сделали бы что-то вроде этого:

import sys
x = sys.stderr.readline()
y = sys.stdin.readline()

sys.stdin и sys.stdout являются стандартными файловыми объектами, как указано выше, определенными в модуле sys . Вы также можете взглянуть на модуль труб .

Чтение данных с помощью readline (), как в моем примере, является довольно наивным способом получения данных. Если вывод не является ориентированным на линию или индетерминированным, вы, вероятно, захотите изучить опрос, который, к сожалению, не работает в окнах, но я уверен, что есть какая-то альтернатива.





cmd