È possibile comunicare con un sottoprocesso con sottoprocesso. Apri?
-
05-07-2019 - |
Domanda
Sto cercando di scrivere uno script Python che comprime il nostro software. Questo script deve creare il nostro prodotto e confezionarlo. Attualmente abbiamo altri script che eseguono ogni pezzo individualmente che includono script csh e perl. Uno di questi script viene eseguito come:
sudo mod args
dove mod è uno script perl; quindi in Python lo farei
proc = Popen(['sudo', 'mod', '-p', '-c', 'noresource', '-u', 'dtt', '-Q'], stderr=PIPE, stdout=PIPE, stdin=PIPE)
Il problema è che questo script mod necessita di alcune risposte. Per questo ho pensato che il tradizionale
(stdout, stderr) = proc.communicate(input='y')
funzionerebbe. Non penso che funzioni perché il processo che Popen sta controllando è sudo, non lo script mod che sta ponendo la domanda. Esiste un modo per comunicare con lo script mod e comunque eseguirlo tramite sudo?
Soluzione
Sceglierei di andare con Pexpect.
import pexpect
child = pexpect.spawn ('sudo mod -p -c noresource -u dtt -Q')
child.expect ('First question:')
child.sendline ('Y')
child.expect ('Second question:')
child.sendline ('Yup')
Altri suggerimenti
Penso che dovresti rimuovere il sudo
nella tua chiamata Popen
e richiedere all'utente del tuo script di digitare sudo
.
Questo rende ulteriormente esplicita la necessità di privilegi elevati nel tuo script, invece di nasconderlo all'interno di Popen
.
La cosa più semplice da fare sarebbe eseguire lo script di controllo (lo script Python) tramite sudo
. Sei in grado di farlo o non è un'opzione?
Abbiamo bisogno di maggiori informazioni.
- Sudo ti sta chiedendo una password?
- Che tipo di interfaccia ha lo script mod per porre domande?
Perché questo tipo di cose non sono gestite normalmente sulla pipe.
Una soluzione per entrambi potrebbe essere Pexpect , che è piuttosto esperto nel gestire divertenti script che richiedono password e vari altri problemi di input.