É possível se comunicar com um subprocesso com subprocess.popen?
-
05-07-2019 - |
Pergunta
Estou tentando escrever um script python que empacota nosso software. Este script precisa construir nosso produto e empacotá -lo. Atualmente, temos outros scripts que fazem cada peça individualmente, que incluem scripts CSH e Perl. Um desses scripts é executado como:
sudo mod args
onde mod é um script perl; Então, em python, eu faria
proc = Popen(['sudo', 'mod', '-p', '-c', 'noresource', '-u', 'dtt', '-Q'], stderr=PIPE, stdout=PIPE, stdin=PIPE)
O problema é que este script de moda precisa de algumas perguntas respondidas. Para isso eu pensei que o tradicional
(stdout, stderr) = proc.communicate(input='y')
podia funcionar. Eu não acho que esteja funcionando porque o processo que Popen está controlando é sudo, não o script de mod que está fazendo a pergunta. Existe alguma maneira de se comunicar com o script mod e ainda executá -lo no sudo?
Solução
Eu escolheria ir com o 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')
Outras dicas
Eu acho que você deveria remover o sudo
na tua Popen
ligue e requer o usuário de sua script para digitar sudo
.
Isso também torna mais explícito a necessidade de privilégios elevados em seu script, em vez de escondê -lo dentro Popen
.
A coisa mais simples a fazer seria a execução do script de controle (o script python) via sudo
. Você pode fazer isso ou isso não é uma opção?
Precisamos de mais informações.
- Sudo está pedindo uma senha?
- Que tipo de interface o script moda para fazer perguntas?
Porque esse tipo de coisa não é tratado como normal sobre o tubo.
Uma solução para ambos pode ser Pexpect, que é bastante especialista para lidar com scripts engraçados que solicitam senhas e vários outros problemas de entrada.