pty Verständnisproblem

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Pygoscelis papua
User
Beiträge: 206
Registriert: Freitag 13. März 2015, 18:36

Ich habe mal diesen Artikel hier gelesen:
https://docs.python.org/3.2/library/pty.html

Ich habe mich damit schon mal beschäftigt, bin aber zu keinem wirklichen Ergebnis gekommen.
Ich wollte eigentlich einen Prozess erstellen, welchem ich über eine Funktion den stdin senden kann,
also z.B. starte ich in einem pty nano (oder irgendein anderes Programm) und sende dem dann (von "außerhalb")
über eine Funktion ein "a".

Hat jemand eine Idee zur Umsetztung?
Ich habe glaube ich die pty.spawn Methode nicht verstanden.
Also das lesen ist ja kein Problem, da ist ja unten ein Beispiel, aber das Schreiben geht nicht.
import this
hidden python features

JAVA = Just Another Vulnerability Announcement :D
BlackJack

@Pygoscelis papua: `pty.spawn()` ruft die beiden Lesefunktionen auf. Das heisst wenn Du etwas schreiben willst, musst das innerhalb der Lesefunktion tun. Nur dort bekommst Du ja auch den Dateideskriptor in die Finger. Beispiel zum Starten von ``nano`` und schreiben eines 'a':

Code: Alles auswählen

#!/usr/bin/env python
# coding: utf8
from __future__ import absolute_import, division, print_function
import os
import pty


class Communicator(object):

    def __init__(self):
        self.has_written_a = False

    def __call__(self, fd):
        data = os.read(fd, 1024)
        if not self.has_written_a:
            os.write(fd, 'a')
            self.has_written_a = True
        return data


def main():
    pty.spawn('nano', Communicator())
 

if __name__ == '__main__':
    main()
Bevor Du da aber weiter dran bastelst, sag mal was Du *eigentlich* machen willst. Nicht das Du am Ende so etwas wie `pexpect` selbst programmierst.
Pygoscelis papua
User
Beiträge: 206
Registriert: Freitag 13. März 2015, 18:36

Was ich eventuell Programmieren will (wenn ich Zeit dafür finde):
Ein Terminalwidget für PyQt

Eine Frage noch zu dem Quelltext: ist fd in der __call__ Methode dann die device-file des pty?
import this
hidden python features

JAVA = Just Another Vulnerability Announcement :D
BlackJack

@Pygoscelis papua: Das klingt nach viel arbeit. Und das gibt's doch sicher schon fertig. Zum Beispiel https://pypi.python.org/pypi/pyqterm
Pygoscelis papua
User
Beiträge: 206
Registriert: Freitag 13. März 2015, 18:36

Das ist aber für Qt4 und nicht Qt5 :( und qtermwidget geht auch nicht richtig.
import this
hidden python features

JAVA = Just Another Vulnerability Announcement :D
BlackJack

@Pygoscelis papua: Ist Qt5 denn *so* unterschiedlich zu Qt4? Ich habe damit noch nichts gemacht, aber ich vermute mal die tatsächliche Terminalemulation ist mehr als der GUI-Code.
Pygoscelis papua
User
Beiträge: 206
Registriert: Freitag 13. März 2015, 18:36

Ja, stimmt. Vielleicht sollte ich einfach mal probieren den in Qt5 neu zu schreiben.
Mir bleibt wohl nichts anderes übrig :(
import this
hidden python features

JAVA = Just Another Vulnerability Announcement :D
Pygoscelis papua
User
Beiträge: 206
Registriert: Freitag 13. März 2015, 18:36

Ich musste das auch erst mal nach Python3 portieren, da es in Python2 geschrieben war.
import this
hidden python features

JAVA = Just Another Vulnerability Announcement :D
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

@Pygoscelis papua:
Der Viewteil dürfte relativ überschaubar sein und lässt sich sicherlich mit Qt5 Komponenten fast 1:1 umsetzen. Der dicke Brocken beim einem Terminalemulator ist das Parsen der Eingabe und die Zustandsbehandlung des Emulators selbst. Letzteres ist ein großer Spass selbst zu bauen, weil vieles schlecht bis gar nicht dokumentiert ist.
Pygoscelis papua
User
Beiträge: 206
Registriert: Freitag 13. März 2015, 18:36

Ja sowas verstehe ich immer nicht.
Es sollte doch einem Programmierer auffallen, dass es sehr kompliziert ist ein Stück Code zu schreiben.
Warum kann man es dann nicht einfach dokumentieren?
Ich versuch es natürlich in PyQt5 umzusetzten, bis jetzt bin ich aber noch nicht sehr weit, das müsste aber
schaffbar sein.
import this
hidden python features

JAVA = Just Another Vulnerability Announcement :D
BlackJack

@Pygoscelis papua: Was willst Du da dokumentiert haben und von welchem Programmierer? Terminalemulatoren emulieren *Terminals*. Das ist uralte Hardware. Da gibt's uralte Dokumentation, die die API beschreibt, aber nicht was das Terminal *intern* damit in Hard- und vielleicht auch ein bisschen Software dann macht. Problematisch ist, dass es Zustände geben kann die durch die Dokumentation nicht klar definiert sind, und sehr wahrscheinlich auch Fehler die natürlich in der Emulation auch gemacht werden müssen. Da muss man dann schauen wie sich ein echtes Terminal verhält. Und teilweise dann sicher auch raten. Aber das ist ja alles Arbeit die schon gemacht ist und die Dich nicht wirklich zu interessieren braucht.
Pygoscelis papua
User
Beiträge: 206
Registriert: Freitag 13. März 2015, 18:36

Naja ich habe es jetzt auf PyQt5 und Python3 portiert bekommen.
Der Code ist unter GPLv2, kann ich den dann in einer eigenen Repo auf Github hochladen?
import this
hidden python features

JAVA = Just Another Vulnerability Announcement :D
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

Solange Du sicherstellen kannst, dass der Autor des Paketes, welches Du modifiziert hast, nicht schon lizenzrechtliche Probleme bei der Angabe von GPL2 drinhatte (also Rechte Dritter verletzt/übergangen hat), sollte es klargehen.
Antworten