Est-il possible de communiquer avec un sous-processus avec subprocess.Popen?
-
05-07-2019 - |
Question
J'essaie d'écrire un script python qui contient nos logiciels. Ce script doit construire notre produit et le conditionner. Actuellement, nous avons d'autres scripts qui font chaque morceau individuellement, y compris les scripts csh et perl. Un de ces scripts est exécuté comme suit:
sudo mod args
où mod est un script Perl; donc en python je ferais
proc = Popen(['sudo', 'mod', '-p', '-c', 'noresource', '-u', 'dtt', '-Q'], stderr=PIPE, stdout=PIPE, stdin=PIPE)
Le problème est que ce script de mod a besoin de réponses à quelques questions. Pour cela, je pensais que le traditionnel
(stdout, stderr) = proc.communicate(input='y')
fonctionnerait. Je ne pense pas que cela fonctionne car le processus contrôlé par Popen est sudo, et non le script mod qui pose la question. Existe-t-il un moyen de communiquer avec le script mod et de le lancer via sudo?
La solution
Je choisirais d’utiliser 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')
Autres conseils
Je pense que vous devriez supprimer le sudo
de votre appel Popen
et demander à l'utilisateur de votre script de saisir sudo
.
Cela rend en outre plus explicite le besoin de privilèges élevés dans votre script, au lieu de le cacher dans Popen
.
La chose la plus simple à faire serait d’exécuter le script de contrôle (le script Python) via sudo
. Pouvez-vous le faire ou n'est-ce pas une option?
Nous avons besoin de plus d'informations.
- sudo vous demande-t-il un mot de passe?
- Quel type d'interface le script mod permet-il de poser des questions?
Parce que ce genre de choses ne sont pas traitées normalement sur le tuyau.
Une solution pour ces deux solutions pourrait être Pexpect , qui est plutôt un expert en gestion de contenu drôle. des scripts qui demandent des mots de passe et divers autres problèmes d’entrée.