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 сценарий получает все управление.