2011-10-29 22 views
15

Tôi đã viết một ứng dụng tiện ích nhỏ sử dụng Python 3 (testcase bên dưới cũng hoạt động trong Python 2, tuy nhiên) và PyQt 4 sử dụng mô-đun code để sinh ra một dấu nhắc REPL cho phép tương tác với một cửa sổ Qt.Thiết bị đầu cuối ở trạng thái bị hỏng (văn bản vô hình/không có tiếng vang) sau khi thoát() trong khi nhập()/raw_input()

Đáng tiếc là tôi đã trúng một vấn đề tôi đã không thể giải quyết: Khi tôi exit() các ứng dụng trong khi code là bên trong input() (được gọi là raw_input() bằng Python 2.x), thiết bị đầu cuối Linux của tôi sau đó không có tiếng vang còn gõ ký tự. I E. các thiết bị đầu cuối dường như còn lại trong một trạng thái bị hỏng, có lẽ do một số chuỗi thoát được phát hành bởi input().

Tôi đã thử nhiều cách tiếp cận để sửa lỗi này, từ việc sử dụng các mô-đun curses và phương tiện khác để thiết lập lại các thiết bị đầu cuối trước khi chạy exit, để cố gắng thi đua các stdin suối để thoát bởi thực tế bàn giao exit() đến đầu vào() (unfornunately code.InteractiveConsole.push() không hoạt động theo cách đó, như người ta có thể nghĩ rằng nó sẽ), để cố gắng để viết riêng của tôi không bị chặn input() sử dụng threading, nhưng tôi đã không thể kéo cùng một cái gì đó làm việc.

Here, here, herehere là các cuộc thảo luận về các sự cố tương tự.

Cuối cùng, đây là một testcase giảm để chứng minh vấn đề:

#!/usr/bin/env python3 

import code 
import sys 
from PyQt4.QtGui import QApplication, QWidget 

app = QApplication(sys.argv) 

app.lastWindowClosed.connect(exit) 

widget = QWidget() 
widget.show() 

code.interact() 

Đối với những người không quen với (Py) Qt, điều này sẽ mở ra một cửa sổ trống, và khi nó được đóng lại, kết nối từ app ' s lastWindowClosed tín hiệu sẽ gây ra một cuộc gọi đến được xây dựng trong exit() chức năng xảy ra. Điều này xảy ra trong khi mô-đun code đang thực hiện cuộc gọi đến input() để đọc từ sys.stdin. Và ở đây, khi tôi đóng cửa sổ, nhập vào thiết bị đầu cuối sau đó không hiển thị bất kỳ ký tự kiểu nào.

Tôi chủ yếu sử dụng Python 3 và ứng dụng thực tế sử dụng mã Python 3 cụ thể, nhưng tôi cũng đã thử testcase trong Python 2.7 và cho thấy cùng một vấn đề.

+0

tôi không thể tái tạo các vấn đề trong win7 64bit python26. Nếu tôi đóng khung qt, giao diện điều khiển sẽ mang lại dấu nhắc bình thường và tôi có thể nhập văn bản trên đó. – joaquin

+1

Tôi nên đề cập rằng tôi đang chạy trên Linux (tôi sẽ chỉnh sửa để đề cập đến điều đó). Hành vi của thiết bị đầu cuối có thể khác nhau đáng kể giữa các nền tảng. Cảm ơn bạn đã kiểm tra! – Sho

Trả lời

15

Đây không phải là giải pháp thực sự cho vấn đề, nhưng nếu bạn nhập "đặt lại" trong thiết bị đầu cuối sau khi đã đóng ứng dụng, nó sẽ trở lại bình thường.

Tôi gặp sự cố tương tự một lần khi phát triển ứng dụng c không đóng đúng đường ống. Có thể một cái gì đó tương tự đang xảy ra ở đây là tốt.

+0

Tôi thấy rằng 'reset' và' tput reset' đều không đáng tin cậy. – Samveen

0

Tôi đã chạy đến cùng một vấn đề bằng cách sử dụng mô-đun curses. Sử dụng câu trả lời khác trên trang này, tôi đã sidestepped vấn đề với import os ở đầu chương trình, và sau đó kết thúc chương trình với os.system('reset').

13

Hãy thử os.system('stty sane'). Các stty sane là nghĩa vụ phải thiết lập lại echo, và một số những thứ khác rõ ràng.

+1

Rực rỡ! Lệnh 'stty sane' thực sự nhận được thiết bị đầu cuối ra khỏi chế độ * raw * mà không xóa chính thiết bị đầu cuối đó là những gì xảy ra khi sử dụng lệnh' reset'. Cảm ơn! –

+0

Bạn được chào đón. –

+0

Câu trả lời này phải được chấp nhận. Thực sự giải quyết vấn đề. – udondan

1

Câu trả lời từ Quentin Engles cũng có tác dụng đối với tôi, nhưng với tư cách là một người mới về Python, tôi không hiểu vị trí của stty sane.Sau khi một số săn bắn và đầu gãi tôi đã tìm ra lối ra đó là một tham chiếu đến phương pháp exit() vì vậy tôi tạo exiting() và thông qua một tham chiếu đến nó:

#!/usr/bin/env python3 

import code 
import sys 
from PyQt4.QtGui import QApplication, QWidget 

def exiting(): 
    os.system('stty sane') 
    exit() 

app = QApplication(sys.argv) 

app.lastWindowClosed.connect(exiting) 

widget = QWidget() 
widget.show() 

code.interact() 
Các vấn đề liên quan