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.
pty Verständnisproblem
-
- User
- Beiträge: 206
- Registriert: Freitag 13. März 2015, 18:36
@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':
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.
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()
-
- 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?
Ein Terminalwidget für PyQt
Eine Frage noch zu dem Quelltext: ist fd in der __call__ Methode dann die device-file des pty?
@Pygoscelis papua: Das klingt nach viel arbeit. Und das gibt's doch sicher schon fertig. Zum Beispiel https://pypi.python.org/pypi/pyqterm
-
- 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.
@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.
-
- 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
Mir bleibt wohl nichts anderes übrig
-
- 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.
@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.
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.
-
- 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.
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.
@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.
-
- 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?
Der Code ist unter GPLv2, kann ich den dann in einer eigenen Repo auf Github hochladen?
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.