Захват результатов программы, запущенной через скрипт cmd - PullRequest
0 голосов
/ 25 июня 2018

Я пытаюсь сделать анализ сложности Стэнфордского парсера.Для этого я запускаю программу через файл cmd, поэтому, если я использую subprocess.check_output, моя программа на python выдаст мне аргументы командной строки, которые я использую.Синтаксический анализатор печатает свою собственную среду выполнения в командной строке, поэтому я должен на самом деле придумать что-то, что считывает, какую программу я начал печатать в командной строке.

subprocess.check_output("path-to-cmd", shell=True tldr: Это дает мне вывод cmd-файлов, я хочу, чтобы запущенная программа печаталась в терминале.

Поскольку мой вопрос был помечен как дубликат, я хочу выводпрограммы, которую я запустил с помощью cmd, если я использую subproces.check_output, он просто выдаст мне содержимое моего cmd, а не выходные данные java-программы, которую я запустил.Я хочу захватить то, что Java-программа написала в терминал.

1 Ответ

0 голосов
/ 26 июня 2018
import subprocess

# Create test file.
with open('test.cmd', 'w') as w:
    w.write(
     '@echo off\n'
     'echo 1 stdout\n'
     '>&2 echo 2 stderr\n'
     '>&3 echo 3 program output\n')

output = subprocess.check_output(
 'test.cmd 1>nul',
 universal_newlines=True,
 shell=True)

print('check_output:', repr(output))

Пример получит выходные данные программы из дескриптора 3. Здесь программа представляет собой echo для имитации программы, хотя целью является перенаправление.

CMD поддерживает до 9 дескрипторов выводакак указано на сайте SS64 :

STDIN  = 0  Keyboard input
STDOUT = 1  Text output
STDERR = 2  Error text output
UNDEFINED = 3-9

Вы можете выводить программы для обработки 3 в пакетном файле.Затем вы можете перенаправить дескриптор 1 в nul, то есть 1>nul или просто >nul в файле Python.Таким образом, check_output будет выводить только дескриптор 3 в качестве стандартного вывода.

Вывод:

2 stderr
check_output: '3 program output\n'
  • Для вывода используется repr(), чтобы показать вывод в 1 строке для тестирования.
  • Нет вывода строки 1 stdout, так как дескриптор 1 был перенаправлен на nul.
  • Stderr все равно будет распечатывать на консоли, поскольку он не перенаправлен.Вы можете выбрать способ обработки stderr.

Если Stanford Parser выводит данные как stderr (дескриптор 2) вместо stdout (handle 1), тогда вы можете использовать 2>&3 в команде пакетного файла для перенаправления на обработчик 3. т. е.

2>&3 java -cp stanford-parser.jar ...

У меня нет опыта работы с Stanford Parser , поэтому пример команды является догадкой из онлайн-примеров из stanford.edu .

Если вы хотите, чтобы весь вывод вместо просто вывода программы и выходов программы обрабатывал 2. Затем используйте в check_output с 2>&1 или рекомендуемый аргумент stderr=subprocess.STDOUT и пропустите 1>nul.Это может включать ошибки сценария пакетного файла, которые могут быть нежелательными.

Если возможно, переписать пакетный файл в Python, чтобы избежать сложностей, и 1 сценарий получает все управление.

...