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

Как известно, C не имеет динамического охвата, но, предположив, что это действительно так, программа будет печатать 3 4.

В основном, a и b являются глобальными. a будет установлено равным 2, так как мы увидим, что это то, что p вернется.

В p, вызванном из main, b по-прежнему является глобальным, но a является локальным в p. Локальный a установлен в 0, но скоро исчезнет. Глобальное значение b установлено в 1. Локальный p установлен в 2, и будет возвращено значение 2. Теперь глобальный b равен 1.

В q, вызванном из main, a является глобальным, но b является локальным в q. Здесь глобальное значение a задано равным 3, а локальное b - 4.

В принте, вызванном из q, a является глобальным (имеющим значение 3), а b - локальный в q (который имеет значение 4).

На этом последнем этапе внутри функции print мы видим отличие от статического охвата. При статическом охвате a и b будут глобальными. С динамическим охватом мы должны смотреть на цепочку вызывающих функций, а в q находим переменную b, которая будет использоваться внутри печати. ​​

8
задан sparkes 24 August 2008 в 10:29
поделиться

5 ответов

Если Вы говорите об интерпретаторе 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 () как в моем примере является довольно наивным способом получить данные все же. Если вывод не ориентирован на строку или indeterministic, Вы, вероятно, хотите изучить опрос, который, к сожалению, не работает в окнах, но я уверен, что там существует некоторая альтернатива.

9
ответ дан 5 December 2019 в 09:27
поделиться

На самом деле Вы определенно можете, и это является красивым, ужасным, и сумасшедшим одновременно!

Можно заменить 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 (где печать обычно печатает к),
  • первая строка, которая записана в stderr, является той, запускающейся с 'Него'
  • следующие две строки - те, которые были собраны в объекте StringIO

Замена sys.stdout/err как это является приложением того, что назвало monkeypatching. Мнения могут варьироваться, 'поддерживается' ли это, и это - определенно ужасный взлом, но это убралось подобру-поздорову при попытке перенести внешний материал несколько раз.

Протестированный на Linux, не в Windows, но это должно работать точно также. Сообщите мне, работает ли это над Windows!

3
ответ дан 5 December 2019 в 09:27
поделиться

Вы хотите подпроцесс. Взгляд конкретно на Popen в 17.1.1 и связывается в 17.1.2.

1
ответ дан 5 December 2019 в 09:27
поделиться

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

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

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

somescript.py | your-capture-program-here

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

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

0
ответ дан 5 December 2019 в 09:27
поделиться

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

1. Можно ли получить вывод интерпретатора 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 в тот же или другой файл. Также см. Этот ответ на связанный вопрос.

5
ответ дан 5 December 2019 в 09:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: