2016-03-23 4 views
0

Я хочу общаться с регистратором данных через Telnet. Поэтому я написал следующий питон-скрипт:Закрытие окна Plink с Python

import subprocess 

command ='plink.exe -telnet -P 23 12.17.46.06' 

p = subprocess.Popen(command, stdin=subprocess.PIPE, stdout=subprocess.PIPE, bufsize=1, shell=False) 

answer = p.communicate('command')[0] 
print answer 

Запустив сценарий, палить-окно всплывает. Кажется, что скрипт python ждет выполнения некоторых действий внутри окна команды plink. Закрывая окно вручную, нужный «ответ» появляется внутри python.

Я ищу команду/процедуру, чтобы закрыть plink прямо из python. Кажется, этого недостаточно, чтобы просто закрыть подпроцесс, так как в этом случае связь между python и plink закрывается, а не сама программа plink.exe.

Любая помощь приветствуется! С уважением, Фил

ответ

2

В документации для функции communicate() указано: Подождите завершения процесса. Таким образом, функция не возвращается до выхода plink.exe и, следовательно, ваша программа не получает выход до тех пор.

Вы должны добавить к своему 'command' что-то, что закроет telnet-соединение. Когда дальний конец закрывает соединение telnet, plink.exe выйдет, и его окно закроется. Если ваш сеанс telnet запускает оболочку unix, вы можете добавить '; exit "в вашу команду.

+0

Спасибо за разъяснение в отношении команды communication() -. Однако остается вопрос, как выйти из plink непосредственно из python. Скрипт python работает на 64-разрядной версии Windows 7. –

+0

Ваш вопрос - [проблема XY] (https://meta.stackexchange.com/questions/66377/what-is-the-xy-problem). plink выйдет, когда соединение будет закрыто. Как вы узнаете, когда *, чтобы убить его? Вы можете убить его, если хотите, путем вызова ['.kill()'] (https://docs.python.org/3/library/subprocess.html#subprocess.Popen.kill). Конечно, ваша программа ничего не может сделать, пока она заблокирована, ожидая завершения процесса. Вы либо захотите узнать многопоточность (что очень сложно сделать без ошибок), либо предоставить тайм-аут для связи() или использовать неблокирующий подход к управлению каналом. – dsh

+0

Хорошо, тогда мне нужно повторно сформулировать свою проблему: как я могу убить telnet-соединение, установленное plink **, с помощью python **? Ваше предложение относительно тайм-аута было бы достаточным для меня. Однако, как я уже упоминал ранее, я могу завершить соединение с python до plink, но не telnet-соединение самого plink. –

0

Вы можете проверить, если ваша задача в Plink туннеля завершена, а затем выполнить Taskkill в вашем скрипте

что-то подобное,
killProg = taskkill /f /fi "imagename eq plink.exe"
p.communicate ('killProg') [0]

Это убьет plink, оставив туннель открытым для выполнения других команд.