2016-03-23 16 views
0

私はTelnetでデータロガーと通信したいと思います。したがって、私は次のpythonスクリプトを書いています:PythonでPlinkウィンドウを閉じる

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 

スクリプトを実行すると、plink-windowsがポップアップします。 Pythonスクリプトは、plinkコマンドウィンドウ内で何らかのアクションが実行されるのを待っているようです。手動でウィンドウを閉じると、Pythonの中に目的の "答え"が表示されます。

私はPythonから直接plinkを閉じるコマンド/プロシージャを探しています。この場合、pythonとplinkの間の通信だけが閉じられ、プログラムplink.exe自体は閉じられないので、サブプロセスを閉じるだけでは十分ではないようです。

ご協力いただきましてありがとうございます。 よろしくお願いします。

答えて

2

communicate()関数のドキュメントには、次のように書かれています。プロセスが終了するのを待ちます。したがって、関数はplink.exeが終了するまで戻りません。したがって、あなたのプログラムはそれまで出力を得ていません。

'command'に、テルネット接続を閉じるものを追加する必要があります。遠端がtelnet接続を閉じると、plink.exeは終了し、そのウィンドウが閉じます。あなたのtelnetセッションがUNIXシェルを実行している場合は、 ';あなたのコマンドに「exit」してください。

+0

communications() - コマンドの説明に感謝します。しかし、疑問は、pythonから直接plinkを終了する方法に残っています。 Pythonスクリプトは、Windows 7 64ビットで動作します。 –

+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

さて、私は私の問題を再定式化しなければならない:どのように私はPython **でplink **によって確立されたtelnet接続を殺すことができますか?タイムアウトに関するあなたの提案は、私には十分です。しかし、前にも触れましたが、私はPythonからPlinkへの接続を終了できますが、plink自体のtelnet接続は終了できません。 –

0

あなたはPLINKトンネル内のタスクが完了したかどうかを確認してから、スクリプト内

何かのように、
killProg = taskkill /f /fi "imagename eq plink.exe"
p.communicate( 'killProg')[0]

を taskkillを実行することができます

これは、他のコマンドを実行するためにトンネルを開いたままにしている間、plinkを殺します。

関連する問題