2011-08-26 29 views
12

Có cách nào để tạo một thiết bị đầu cuối thứ hai để tất cả các cuộc gọi đến các chức năng curses hoạt động trên đó, thay vì trong thiết bị đầu cuối hiện tại? Tôi làm việc nhanh hơn nhiều khi tôi có thể thử những thứ tương tác, vì vậy tôi muốn có thể chạy một trình thông dịch python tương tác trong một thiết bị đầu cuối và xem đầu ra curses trong một thiết bị đầu cuối khác.Có cách nào để chương trình tương tác một Python nguyền rủa ứng dụng?

Vì vậy, hãy gọi initscr() trong cửa sổ tương tác hoặc không thành công (PyDev) hoặc vĩnh viễn lấy cửa sổ làm mới từ máy chủ (Spyder) hoặc gây ra hành vi lạ trong bảng điều khiển (IPython).

Có thể tiếp nhận thiết bị đầu cuối khác bằng cách sử dụng setupterm() không? Nếu vậy, tôi nhận được một chuỗi TERM khác để gọi nó bằng cách nào?

Trả lời

3

Tôi không tin như vậy là module lời nguyền là chủ yếu (hoàn toàn?) Thực hiện tại C cấp độ. Nó không chắc rằng nó sẽ cung cấp móc như vậy, mặc dù nếu bạn đã quen thuộc với ngôn ngữ nó có thể có giá trị tìm kiếm thông qua nguồn.

Tuy nhiên khi đọc câu hỏi của bạn, tôi đã nghĩ đến một kỹ thuật khác mà tôi sử dụng trong các ngữ cảnh khác. Bạn có thể lưu một tập lệnh thông qua một thiết bị đầu cuối/trình soạn thảo khác và sử dụng một kỹ thuật tương tự như lệnh dnotify (hoặc thậm chí là bỏ phiếu đơn giản) để tải nó vào chương trình đang chạy của bạn.

Một ý tưởng khác là sử dụng ổ cắm để gửi lệnh và thực hiện chúng. Tất nhiên điều này là an toàn nguy hiểm-khôn ngoan để có những biện pháp phòng ngừa cần thiết.

Bạn sẽ phải xây dựng một số cơ sở hạ tầng, nhưng có thể sẽ dễ dàng hơn nhiều so với việc thêm nhiều hỗ trợ thiết bị để nguyền rủa.

1

Vâng, tôi không chắc tôi hiểu hoàn toàn những gì bạn đang cố gắng làm. Nhưng những gì tôi đã hiểu là điều này mà bạn muốn có một giao diện điều khiển python chuẩn, nơi bạn có thể nhập mã động của bạn. Nhưng khi bạn gọi, cho exemple một chức năng, đầu ra của việc xử lý các chức năng này sẽ xuất hiện vào một thiết bị đầu cuối?

Vâng ... để nó hoạt động, tôi nghĩ kiến ​​trúc sẽ sử dụng sẽ là "máy chủ khách".

Bởi vì một quá trình có stdout và stderr, và trong kiến ​​trúc đa xử lý, bạn có thể sử dụng stderr làm đường ống đầu ra của hàm. Nhưng vấn đề là khởi tạo thiết bị đầu cuối khác được tách ra khỏi thiết bị đầu cuối chính. (không chồng chéo bên trong cùng một không gian).

Nếu chương trình chính của bạn khởi tạo máy chủ (trên một quy trình Python khác, vì bản chất của máy chủ) sẽ gửi đầu ra tới tất cả máy khách được kết nối với nó. Bằng cách này bạn có thể hình dung đầu ra của hàm trên một số máy khách đầu cuối và/hoặc một máy tính khác có thể kết nối với máy chủ của bạn.

Đó là, theo ý kiến ​​của tôi, dễ dàng hơn nhiều so với cố gắng sử dụng gói 'nguyền rủa'. Nhưng nếu mục đích duy nhất là để có được một cái nhìn sâu sắc về mã của bạn, tôi nghĩ rằng nó quá phức tạp (không có giá trị gia tăng).


Bạn vẫn có tùy chọn bán phá giá đầu ra của chức năng vào một tập tin văn bản (log.txt)

3

Bạn có thể sử dụng code.InteractiveConsole và SocketServer để đính kèm một vỏ tương tác python vào một ổ cắm và thực hiện phát triển của bạn thông qua đó.Một ví dụ đơn giản trông giống như:

import sys 
import SocketServer 
from code import InteractiveConsole 

class InteractiveServer(SocketServer.BaseRequestHandler): 
    def handle(self): 
     file = self.request.makefile() 
     shell = Shell(file) 
     try: 
      shell.interact() 
     except SystemExit: 
      pass 


class Shell(InteractiveConsole): 
    def __init__(self, file): 
     self.file = sys.stdout = file 
     InteractiveConsole.__init__(self) 
     return 

    def write(self, data): 
     self.file.write(data) 
     self.file.flush() 

    def raw_input(self, prompt=""): 
     self.write(prompt) 
     return self.file.readline() 

if __name__ == '__main__': 
    HOST, PORT = "0.0.0.0", 9999 

    server = SocketServer.TCPServer((HOST, PORT), InteractiveServer) 
    server.serve_forever() 

Khi bạn đã thiết lập và chạy, bạn có thể kết nối với cổng 9999 từ thiết bị đầu cuối khác và thực hiện công việc của bạn. Bạn có thể thấy điều này hoạt động trong this screenshot (PNG)

Thông tin cơ bản về cách sử dụng InteractiveConsole được chụp from this post. Tôi đã sửa đổi nó để làm việc với SocketServer cho một dự án khác mà tôi đang làm việc.

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