2011-08-26 14 views
12

Czy istnieje sposób na utworzenie drugiego terminala, aby wszystkie połączenia z funkcjami curses działały w tym trybie, a nie w istniejącym terminalu? Pracuję znacznie szybciej, gdy mogę wypróbować rzeczy interaktywnie, więc chciałbym móc uruchomić interaktywnego interpretera pytonów w jednym terminalu i zobaczyć klątwy w innym.Czy istnieje sposób interaktywnego programowania aplikacji curses Python?

W obecnej sytuacji wywołanie initscr() w oknie interaktywnym kończy się niepowodzeniem (PyDev) lub trwale usuwa odświeżenie okna z hosta (Spyder) lub powoduje dziwne zachowanie w konsoli (IPython).

Czy można przejąć inny terminal za pomocą setupterm()? Jeśli tak, to gdzie mogę uzyskać inny ciąg znaków TERM, aby go wywołać?

Odpowiedz

3

nie wierzę, tak jak moduł przekleństwa jest głównie (całkowicie?) Realizowany w C poziom. Jest mało prawdopodobne, że zapewniłoby takie haki, chociaż jeśli znasz język, warto go przejrzeć.

Jednak czytając twoje pytanie myślałem o innej technice, której używam w innych kontekstach. Można zapisać skrypt za pośrednictwem innego terminalu/redaktor i wykorzystywać technikę podobną do komend dnotify (lub nawet prostego wybierania), aby załadować go do uruchomionego programu.

Innym pomysłem byłoby wykorzystanie gniazda do wysyłania poleceń nad i wykonać je. Oczywiście jest to niebezpieczne pod względem bezpieczeństwa, więc zastosuj niezbędne środki ostrożności.

Musisz zbudować jakąś infrastrukturę, ale to prawdopodobnie będzie o wiele łatwiej niż dodanie obsługi wielu urządzeń do przekleństw.

1

Cóż, nie jestem pewien, czy całkowicie rozumiem, co próbujesz zrobić. Ale zrozumiałem, że chcesz mieć standardową konsolę Pythona, w której możesz dynamicznie wpisać swój kod. Ale kiedy zadzwonisz, na przykład, funkcja, wyjście przetwarzania tej funkcji pojawi się w innym terminalu?

Cóż ... aby to działało, myślę, że architektura do wykorzystania będzie "klient-serwer".

Ponieważ proces ma standardowe wyjście i stderr, aw architekturze wieloprocesorowej można użyć stderr jako rury wyjściowej funkcji. Ale problem polega na inicjalizacji drugiego terminala, który jest oddzielony od głównego. (brak nakładania się w tej samej przestrzeni).

Jeśli program główny Inicjalizacja serwera (na innym procesie Python, ponieważ od samego serwera naturze), który wysyła je do wszystkich klientów podłączonych do niego. W ten sposób można zwizualizować wyjście funkcji na kilku klientach terminalowych i/lub innym komputerze, który może połączyć się z serwerem.

Jest to, moim zdaniem, znacznie łatwiejsze niż korzystanie z pakietu "curses". Ale jeśli jedynym celem jest uzyskanie wglądu w twój kod, myślę, że jest on zbyt skomplikowany (bez wartości dodanej).


Nadal masz możliwość dumping wyjście z funkcji w pliku tekstowym (log.txt)

3

Można użyć code.InteractiveConsole i SocketServer dołączyć Pythona interaktywną powłokę do gniazda i zrobić swój rozwój poprzez to.Prosty przykład wygląda następująco:

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

Po uruchomieniu możesz połączyć się z portem 9999 z innego terminala i zrobić swoje. Możesz zobaczyć, że działa to w this screenshot (PNG) Podstawy korzystania z InteractiveConsole zostały wykonane from this post. Zmodyfikowałem go do pracy z SocketServer dla innego projektu, nad którym pracowałem.

Powiązane problemy