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?

Foi útil?

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.

  1. Sudo está pedindo uma senha?
  2. 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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top