2012-02-09 23 views
11

tôi đang đi qua một số đầu vào cho một quá trình với Pexpect với đoạn mã sau:pexpect không thể vượt qua đầu vào hơn 1024 ký tự?

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(). 

Khi INPUT_LEN < 1024, tất cả mọi thứ hoạt động tốt, nhưng cho> = 1024 ký tự, quá trình này không nhận được đầy đủ nhập, gây ra lỗi "pexpect.TIMEOUT" trên p.readline().

tôi đã cố gắng tách đầu vào của tôi thành từng miếng nhỏ hơn 1024 ký tự, nhưng điều này có cùng một vấn đề:

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(). 

Có ai biết làm thế nào để làm cho công việc Pexpect với đầu vào hơn 1.024 ký tự? Tôi đã thử nhìn vào nguồn, nhưng nó chỉ có vẻ được gọi là os.write (...).

(Là một lưu ý phụ, tôi đã nhận thấy lỗi cắt ngắn giống nhau xảy ra khi tôi chạy "mèo" từ trình bao và cố gắng dán> = 1024 ký tự bằng "Cmd + V". Tuy nhiên, mọi thứ hoạt động tốt nếu Tôi chạy "pbpaste | cat".)

Cảm ơn!

Cập nhật: Các cuộc gọi đến "os.write()" lợi nhuận 1025, cho thấy một sự ghi thành công, nhưng os.read() trả về "\ x07" (đĩa đơn nhân vật BEL), và sau đó bị treo trên cuộc gọi tiếp theo, dẫn đến thời gian chờ.

Chia cuộc gọi os.write() thành hai byte ghi 1024 byte() s, cách nhau bằng một cuộc gọi đến os.fsync(), không thay đổi bất cứ điều gì.

+0

'pexpect.spawn' nên có một' từ khóa maxdata' theo mặc định thiết lập cho '2000', vì vậy có lẽ điều này sẽ không áp dụng đối với trường hợp của bạn, nhưng bạn đã thử tăng nó ? –

+0

Thật không may là không hoạt động; xem chỉnh sửa mới nhất – tba

+0

Xin lỗi vì sự nhầm lẫn, tôi đã viết maxdata nhưng tôi có nghĩa là 'maxread', cũng rất đáng thử tôi đoán. –

Trả lời

5

Sự cố của bạn dường như liên quan đến MacOS, hãy xem MacOSX 10.6.7 cuts off stdin at 1024 chars.

Về cơ bản, 1024 là giới hạn bộ đệm tty của bạn.

Tôi không phải là chuyên gia về Mac OS, nhưng có thể những người khác có thể cung cấp cho bạn thêm thông tin về điều này.

+0

Bất kỳ khuyến nghị nào về cách làm việc này xung quanh mức python? ví dụ. bằng cách viết 1023 byte, xóa bộ đệm, sau đó viết phần còn lại? – tba

+0

@tba: Từ những gì bạn đang giải thích vấn đề có vẻ là ở bên đọc.Vì vậy, tôi nghĩ rằng bạn đang xếp chồng với một cách tiếp cận đường ống (như là một trong đó pbpaste có), nhưng tôi sợ rằng có lẽ sẽ vô hiệu hóa nỗ lực của bạn bằng cách sử dụng pexpect. –

+0

Thật không may, việc sử dụng các đường ống với "quy trình con" của python gây ra các bế tắc: xem "Cảnh báo:" về cách sử dụng ".stdin.write" trên http://docs.python.org/library/subprocess.html. Cách giải quyết được đề xuất là sử dụng giao tiếp(), chờ quá trình chấm dứt. Điều này sẽ không hiệu quả đối với tôi vì tôi cần gửi và nhận thông tin với quy trình nhiều lần trước khi nó chấm dứt. – tba

1

Tôi nhận ra điều này rất muộn, nhưng tôi đăng một giải pháp cho một ai đó gặp vấn đề với cùng một vấn đề (như tôi đã làm trước đó).

Dựa trên một số câu trả lời/nhận xét, tôi đã viết một phần mềm giống như gói sử dụng stdin.write và stdout.read thay cho bất kỳ thứ gì mà nó sử dụng. Tôi đã không có cơ hội để kiểm tra nó sẽ rất kỹ lưỡng nhưng đến thời điểm này, nó đã đứng lên đến thử thách.

Bạn có thể tìm mã ở đây: https://github.com/tayyabt/tprocess

Các vấn đề liên quan