2012-07-02 62 views
4

我正在使用pythons pexpect模塊來自動執行任務,我需要幫助確定用於sendcontrol的關鍵字符。怎麼能發送controlkey回車?併爲將來的參考如何找到關鍵字符?python pexpect sendcontrol關鍵字符

這裏是我工作的代碼。

#!/usr/bin/env python 

import pexpect 

id = pexpect.spawn ('ftp 192.168.3.140') 

id.expect_exact('Name') 

id.sendline ('anonymous') 

id.expect_exact ('Password') 
*# Not sure how to send the enter control key 
id.sendcontrol ('???')* 

id.expect_exact ('ftp') 

id.sendline ('dir') 

id.expect_exact ('ftp') 

lines = id.before.split ('\n') 

for line in lines : 
     print line 

回答

9

Pexpect的沒有sendcontrol()方法。在你的例子中,你似乎試圖發送一個空行。爲了做到這一點,使用:

id.sendline('') 

如果您需要發送實時控制字符,你可以send()包含相應的字符值的字符串。例如,發送控制-C您可以:

id.send('\003') 

或:

id.send(chr(3)) 

迴應置評#2:

對不起,我typo'ed模塊名稱 - - 現在修好了。更重要的是,我在noah.org上查看舊文檔,而不是latest documentation at SourceForge。較新的文檔確實顯示sendcontrol()方法。它需要一個參數,它可以是一個字母(例如,sendcontrol('c')發送一個控件-C),也可以是表示不對應於字母的控制字符的各種標點符號之一。但是真的sendcontrol()只是一個方便的包裝send()方法,這是sendcontrol()在計算出您想要發送的實際值之後調用的方法。您可以通過line 973 of this file閱讀源代碼。

我不明白爲什麼id.sendline('')不起作用,尤其是考慮到它顯然適用於將用戶名發送到衍生的ftp程序。如果你想使用sendcontrol()嘗試,而不是那麼這將是兩種:

id.sendcontrol('j') 

發送一個換行符(這是控制-J,或十進制10)或:

id.sendcontrol('m') 

發送一個回車返回(這是控制米,或十三進制)。

如果這些不起作用,請詳細解釋發生了什麼,以及與您想要或預期發生的不同之處。

+0

嗨ottomeister,謝謝你的幫助我真的appriciate它。其實我使用的是一個python模塊,我通過文檔讀取並找到sendcontrol。我用sendline('')試了一下,但沒有幫助。在文檔中它給出了一個sendcontrol('g')的例子,但它沒有解釋g字母的作用和尋找哪種鍵碼。 – SSSSSam

+0

你是一個明星,謝謝你ottomeister,它完美的工作!奇怪的是它與id.sendcontrol('m')j和d一起工作。如果我可以問這些信件,他們究竟是什麼?非常感謝你的幫助。它無法得到更好的回答。 – SSSSSam