2012-02-09 18 views
11

我目前正在通過一些輸入的過程與Pexpect的使用下面的代碼:pexpect無法通過1024個字符的輸入?

p = pexpect.spawn('cat', timeout=5.0) 
p.maxread = 5000 
p.setecho(False) # prevent the process from echoing stdin back to us 
INPUT_LEN = 1024 
p.sendline('a'*INPUT_LEN) 
print p.readline() # pexpect.TIMEOUT: Timeout exceeded in read_nonblocking(). 

當INPUT_LEN < 1024,一切工作正常,但對於> = 1024個字符,過程中不接收完整輸入,導致p.readline()上出現「pexpect.TIMEOUT」錯誤。

我試圖分裂我的輸入成片超過1024個字符較小,但是這同一個問題:

p = pexpect.spawn('cat', timeout=5.0) 
p.maxread = 5000 
p.setecho(False) 
INPUT_LEN = 1024 
p.send('a'*1000) 
p.sendline('a'*(INPUT_LEN-1000)) 
print p.readline() # pexpect.TIMEOUT: Timeout exceeded in read_nonblocking(). 

有誰知道如何在1024個字符使與輸入Pexpect的工作?我試着查看源代碼,但它似乎只是調用os.write(...)。我注意到當我從shell運行「cat」並嘗試用「Cmd + V」粘貼> = 1024個字符時,發生了相同的截斷錯誤。但是,如果一切正常我跑 「pbpaste |貓」)

謝謝!

更新: 的呼籲 「os.write()」 返回1025,指示成功寫,但os.read()返回 「\ X07」(單個字符BEL),然後掛在下一次通話,導致超時。

除以os.write()調用分成兩個子1024字節寫入()S,通過調用分離os.fsync(),不會改變任何東西。

+0

'pexpect.spawn'應該被默認設置爲'2000'一個'maxdata'關鍵字,所以很可能這不會適用於你的情況,但你嘗試過它增大? – 2012-02-09 21:29:39

+0

不幸的是,沒有工作;查看最新編輯 – tba 2012-02-09 21:33:26

+0

對不起,我寫了maxdata,但是我的意思是'maxread',我想這是值得一試的。 – 2012-02-09 21:44:31

回答

5

你的問題似乎MacOS的關係,看看MacOSX 10.6.7 cuts off stdin at 1024 chars

它基本上說,1024是你的tty緩衝限制。

我無法在Mac OS的專家,但也許別人可以給你更多這方面的信息。

+0

有關如何在python級別解決此問題的任何建議?例如通過寫入1023字節,清空緩衝區,然後寫剩下的部分? – tba 2012-02-11 19:33:11

+0

@tba:從你正在解釋的問題看起來似乎是在閱讀方面。所以我認爲你用管道方式堆疊(就像pbpaste所擁有的那種方式),但是我擔心這可能會使你無法使用pexpect。 – 2012-02-15 09:39:50

+0

不幸的是,在python的「subprocess」中使用管道會導致死鎖:請參閱關於在http://docs.python.org/library/subprocess.html上使用「.stdin.write」的「Warning:」。建議的解決方法是使用通信(),它等待進程終止。這對我來說不起作用,因爲我需要在流程終止之前多次發送和接收信息。 – tba 2012-02-16 21:31:52

1

我意識到這是非常非常晚了,但我張貼的人誰絆倒在與同樣的問題,這個問題的解決方案(如我今天早些時候所做的那樣)。

基於一些答案/評論,我已經寫了像包Pexpect的使用stdin.write,而是stdout.read的什麼,那就是Pexpect的使用。我沒有機會對此進行非常徹底的測試,但在這一點上,它已經經受住了挑戰。

您可以在這裏找到代碼:https://github.com/tayyabt/tprocess