Ich muss eine interaktive Bash-Instanz in einem separaten Prozess in Python mit eigenen dedizierten TTY (ich kann nicht pexpect verwenden). ich diesen Code-Snippet verwendete ich in ähnlichen Programmen häufig gebraucht:Interaktive Bash mit Popen und eine dedizierte TTY Python
master, slave = pty.openpty()
p = subprocess.Popen(["/bin/bash", "-i"], stdin=slave, stdout=slave, stderr=slave)
os.close(slave)
x = os.read(master, 1026)
print x
subprocess.Popen.kill(p)
os.close(master)
Aber wenn ich es laufen lasse, bekomme ich die folgende Ausgabe:
$ ./pty_try.py
bash: cannot set terminal process group (10790): Inappropriate ioctl for device
bash: no job control in this shell
Strace des Laufs zeigt einige Fehler:
...
readlink("/usr/bin/python2.7", 0x7ffc8db02510, 4096) = -1 EINVAL (Invalid argument)
...
ioctl(3, SNDCTL_TMR_TIMEBASE or SNDRV_TIMER_IOCTL_NEXT_DEVICE or TCGETS, 0x7ffc8db03590) = -1 ENOTTY (Inappropriate ioctl for device)
...
readlink("./pty_try.py", 0x7ffc8db00610, 4096) = -1 EINVAL (Invalid argument)
Das Code-Snippet scheint ziemlich einfach, ist Bash nicht etwas, was es braucht? Was könnte das Problem hier sein?
Das ist ganz normal - Sie haben eine ** interaktive Shell ** ohne ** Jobkontrolle **. –
Wenn Sie auch die Jobsteuerung wünschen, müssen Sie Ihre Shell zum Prozessleader machen - das ist die neue "Sitzung", sie wird mit 'start_new_session = True' Schlüsselwortargument zu' Popen' (seit Python 3.2) erreicht. Wenn Sie mehr Kontrolle brauchen, verwenden Sie 'preexec_fn = ...' –
Ok, das klingt vernünftig. Ich verstehe, dass die 'start_new_session = True 'nur für> 3.2 relevant ist. Gibt es eine Entsprechung in 2.7? Tut mir leid, sollte wahrscheinlich die Python-Version in der Frage erwähnt haben. – TKKS