2017-01-20 6 views
-1

У меня есть вопрос, но это трудно объяснить мне:Python - передача командной консоли для консольного приложения третьей партии

У меня есть приложение (пусть называем его а), которые имеют свою собственную консоль - это soncole запускается через CMD следующим образом: abc console console.xml abc console start в том же окне, но вместо этого C:\>, я получаю только > - отдых подобен CMD.

Я знаю, что я могу запустить CMD команды т.е., как это:

self.full_path = 'dir /b' 
self.pipe = check_output(self.full_path, shell=True, universal_newlines=True).strip() 

, но, когда я пытаюсь сделать это:

self.full_path = 'abc console console.xml' 
self.pipe = check_output(self.full_path, shell=True, universal_newlines=True).strip() 

ничто не случится, консольный замораживанию. Я попытался добавить еще несколько команд, чтобы проверить, не работает ли «замораживание», например, экспортировать некоторый xml, но ничего не происходит.

Есть ли способ передать команды abc?

+1

Вы должны уточнить, как это приложение получает свои команды от пользователя.Что именно означает, что у него есть «собственная консоль»? Вы говорите с ним о линии, основанной на стиле ответа на вопрос? Или он представляет вам интерфейс на основе символов, т. Е. Помещает материал в определенные ячейки ячеек консоли, редактирует строки, форматирует и тому подобное? Ваш примерный код в вашем вопросе также должен также называть 'abc', а не' dir'. Опишите, какие у вас проблемы, когда вы это делаете. В идеале вы также должны исправить написание: http://stackoverflow.com/help/how-to-ask – blubberdiblub

+0

Привет, пожалуйста, узнайте более подробно в 1-м сообщении – Fangir

ответ

1

Если ваше приложение достаточно простое, оно, скорее всего, примет команды через стандартный ввод. Если вы запустите его непосредственно в оболочке, он получает свой стандартный ввод непосредственно с вашего ввода (если вы не используете перенаправление).

Но если вы запустите его как подпроцесс из другой программы Python и вы хотите автоматизировать его ввод, вы должны сообщить своему коду Python, чтобы передать этот вход в стандартный канал приложения.

Существует несколько способов сделать это с помощью модуля subprocess. Предполагая, что вы хотите, чтобы обеспечить один или группу команд в приложении только один раз, не реагируя на более поздний выход, приурочивая чувствительные действия или взаимодействия с пользователем, вы можете действительно использовать check_output():

import subprocess 

external_command = 'abc console console.xml' 
pass_command = 'twiddle knob\n' 

output = subprocess.check_output(external_command, shell=True, 
           universal_newlines=True, 
           input=pass_command) 

Обратите внимание, что вы передаете строку к параметру input, который включает в себя все команды, которые вы хотите отправить за один раз, ограниченные символами новой строки (отсюда \n).

Вы можете построить эту строку из списка команд, если вы хотите: pass_command = '\n'.join(command_list) + '\n'

Если вам нужен более гибкий способ подачи входа в приложение, вы можете использовать параметр stdin= вместо и передать его файл объект или файловый дескриптор. Или, скорее, используйте Popen() для более гибкого интерфейса.

Также обратите внимание, что check_output() не возвращает трубу, а строку со всем выходом. Поэтому вам нужно убедиться, что ваше приложение заканчивается собой (или отправив ему команду, которая заставляет его выйти), иначе check_output() будет ждать всегда. Если вы не можете или не хотите немедленно прекратить работу, вам необходимо использовать более гибкий интерфейс Popen() и писать/читать по мере необходимости.

+0

Если честно, я пробовал несколько разных подходов, и я не может понять это. 'self.start_abc = Popen (self.run_abc, shell = True, cwd = self.full_path, universal_newlines = True, stdin = self.command_to_abc)'. Я добавил 'cwd', ​​потому что я могу запустить abc только из определенного каталога. В 'self.command_to_abc' есть простой commad, возвращающий выходной файл - этот файл не создается, поэтому все не работает – Fangir

+0

@Fangir, к какому файлу вы ссылаетесь, когда говорите« этот файл не создан »? Разве вывод внешней программы не идет на его stdout (который обычно не является файлом)? – blubberdiblub

+0

Я пробовал тест, чтобы передать команду на консоль abc, которая генерирует xml-файл. Файл не был создан, кроме того, я запустил программу из CMD, и это было выведено: 'AttributeError: объект 'str' не имеет атрибута 'fileno'' – Fangir

1

Благодаря Blubberdiblub, я был в состоянии сделать это:

print("\nStarting ABC console") 
    self.pass_start = Popen(self.run_abc, shell=True, cwd=self.full_path, stdin=PIPE, universal_newlines=True) 
    sleep(20) #becouse consol starts about 15 seconds 

    print("\nExport application") 
    self.pass_start.stdin.write(self.export_app) 
    sleep(2) 

    self.pass_start.kill() 

Mayby это не является совершенным, и более продвинутые пользователи могли бы сделать это лучше, но таким образом я в состоянии открыть консоль ABC, и пропустите там несколько команд, чем закрыть эту консоль.

+1

Обратите внимание, что метод 'write()' просто возвращает количество написанных символов. Поэтому, если вам действительно не нужно это значение, вы можете опустить часть 'self.export_application ='. – blubberdiblub

+0

не думал об этом - даже меньше сумма кода (выше отредактированная версия) - спасибо! – Fangir

 Смежные вопросы

  • Нет связанных вопросов^_^