Como criar um Script que abra um terminal linux e passe comandos para o mesmo?

1,240 views
Skip to first unread message

Marcio Luis Siqueira

unread,
Aug 18, 2014, 8:03:26 PM8/18/14
to python...@googlegroups.com
Olá amigos!

    Preciso da ajuda de vocês; Estou estudando Python por conta, e estou tendo dificuldades em fazer meus scripts python se comunicarem com programas externos.
    Por exemplo, estou tentando criar um script, que quando executado através do navegador de arquivos (clicando com mouse) ele abra um terminal e execute  'wget www.google.com.br' por exemplo; E no decorrer do script, eu possa executar outros comandos shell nesse mesmo terminal.
    Executar os comandos quando eu abro o script a partir do terminal eu consigo, o que não sei é como enviar os comandos para outro terminal já aberto.

   Estou usando:

   
processo = subprocess.Popen(['pantheon-terminal'],
                             stdin
= subprocess.PIPE,
                             shell
= True)
processo
.communicate('wget')


Desde já Obrigado pela atenção.

 

Douglas Camata

unread,
Aug 19, 2014, 9:26:50 AM8/19/14
to python...@googlegroups.com
Basta pegar a saída do Popen que você fez, processar conforme necessário e usar como entrada para o próximo Popen, se você quiser.

processo 
= subprocess.Popen(['pantheon-terminal'],
                             stdin 
= subprocess.PIPE,
                             shell 
= True)

pipe = processo
.communicate('wget google.com')
saida = resultado.stdout.read() 

saida_processada = processa(saiad)

novo_processo = subprocess.Popen(..., stdin=saida_processada)



--
--
------------------------------------
Grupo Python-Brasil
http://www.python.org.br/wiki/AntesDePerguntar
 
<*> Para visitar o site do grupo na web, acesse:
http://groups.google.com/group/python-brasil
 
<*> Para sair deste grupo, envie um e-mail para:
python-brasi...@googlegroups.com

---
Você recebeu essa mensagem porque está inscrito no grupo quot;Python Brasil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para python-brasi...@googlegroups.com.
Para mais opções, acesse https://groups.google.com/d/optout.



--
Douglas Camata
Graduando em Ciência da Computação (UENF)

Skype: douglas_camata
-----------------------------------
Linux User #509211

Douglas Camata

unread,
Aug 19, 2014, 9:29:07 AM8/19/14
to python...@googlegroups.com
Se quer executar no mesmo terminal, você pode montar um comandão bolado tipo: wget google.com | awk | grep && shutdown, coisas do tipo.

Douglas Camata

unread,
Aug 19, 2014, 9:33:13 AM8/19/14
to python...@googlegroups.com
Ah, um detalhe que passou despercebido, quando você passa shell=True para o Popen, ele já executa o comando em um terminal. Então não é necessário você abrir o pantheon-terminal, a não ser que queira vê-lo mesmo. Caso você precise de algo mais complexo, sugiro montar um script shell separado com tudo o que você precisa e executá-lo do Python.

Marcio Luis Siqueira

unread,
Aug 19, 2014, 5:59:15 PM8/19/14
to python...@googlegroups.com
Digite o código aqui...
Digite o código aqui...

    Muito obrigado pela resposta, consegui aprender bastante com ela! Mas Ficou uma dúvida. o que seria o 'resultado' em:
saida = resultado.stdout.read()
   Seria o 'pipe' como abaixo?
saida = pipe.stdout.read()

  Outra coisa, eu fiz:

processo = subprocess.Popen(['wget www.google.com.br'],

                            stdin
= subprocess.PIPE,
                            shell
= True)

  E quando eu executo o script em um terminal, seja indicando o caminho do arquivo.py ou arrastando e soltando o arquivo dendro do terminal o download é feito, mas se executo a partir do clique do mouse ou enter do teclado nada acontece. Já verifiquei as permissões do arquivo e estão corretas.
  Na verdade o que quero é descobrir uma maneira de executar o wget através do Python, e então criar uma interface em Gtk+. Mas esbarrei nesse problema de conseguir funcionar apenas dentro do terminal, por isso quero abrir um terminal e direcionar o wget para ele.
   Mais uma vez obrigado pela ajuda! 

Douglas Camata

unread,
Aug 19, 2014, 6:46:13 PM8/19/14
to python...@googlegroups.com
Exato. Essa variável "resultado" é a mesma que aquele "pipe" do "pipe.stdout.read()", isso foi erro meu. Você adicionou o bang do Python no início do seu script? 

É algo do tipo:

#!/usr/bin/env python

Marcio Luis Siqueira

unread,
Aug 19, 2014, 7:51:32 PM8/19/14
to python...@googlegroups.com
  Não sabia que se chamava 'bang', mas sim... está dessa forma:

#!/usr/bin/python3
# -*- coding: utf-8 -*-

Tmabém tentei como sugeriu: 

processo = subprocess.Popen(['phantehon-terminal | wget www.google.com.br']...
 Mas também não funcionou.

Douglas Camata

unread,
Aug 19, 2014, 7:59:17 PM8/19/14
to python...@googlegroups.com
Você não precisa abrir seu terminal dessa maneira, amigo. Você pode fazer isso assim:

processo = subprocess.Popen('wget google.com.br', shell=True)

Isso já executará o wget em um shell. Não é necessário você executar um terminal. Além de tudo, você precisa saber se seu comando de terminal funciona dessa maneira, entender o que o | faz no shell. 

Sobre não conseguir executar o arquivo, tente mudar as permissões dele da seguinte maneira: chmod +x arquivo.py


--
--
------------------------------------
Grupo Python-Brasil
http://www.python.org.br/wiki/AntesDePerguntar
 
<*> Para visitar o site do grupo na web, acesse:
http://groups.google.com/group/python-brasil
 
<*> Para sair deste grupo, envie um e-mail para:
python-brasi...@googlegroups.com

---
Você recebeu essa mensagem porque está inscrito no grupo quot;Python Brasil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para python-brasi...@googlegroups.com.
Para mais opções, acesse https://groups.google.com/d/optout.

Marcio Luis Siqueira

unread,
Aug 19, 2014, 8:31:01 PM8/19/14
to python...@googlegroups.com
 Amigo, muito obrigado pela ajuda! E me desculpe pela minha ignorância! Descobri o problema... até ri quando vi! (rimou !).
 Quando eu executava o arquivo.py jogando ele direto no terminal, ele salvava o download na memsa pasta onde estava, mas quando eu executava clicando com o mouse, o arquivo do download ia parar na minha pasta home, por isso pensava que não funcionava, pois estava acostumado a ver o download na mesma pasta como nos testes via terminal agora minha home está com dezenas de index.html rs.

Cleiton Bueno

unread,
Aug 19, 2014, 10:29:04 PM8/19/14
to python...@googlegroups.com
Não sei da complexidade de sua aplicação, mas se for apenas para chamar o wget porque não implementa com urllib e/ou urllib2? Creio que ganhara em diversos pontos.

John Evan Dizaro

unread,
Aug 20, 2014, 6:50:31 AM8/20/14
to Python Brasil
Fazendo uma pergunta dentro da pergunta original.
Como ficaria se eu estivesse com um usuario ee precisa se  executar algo em outro usuario?

Obrigado


Em 19 de agosto de 2014 23:29, Cleiton Bueno <cleiton...@gmail.com> escreveu:
Não sei da complexidade de sua aplicação, mas se for apenas para chamar o wget porque não implementa com urllib e/ou urllib2? Creio que ganhara em diversos pontos.

--
--
------------------------------------
Grupo Python-Brasil
http://www.python.org.br/wiki/AntesDePerguntar
 
<*> Para visitar o site do grupo na web, acesse:
http://groups.google.com/group/python-brasil
 
<*> Para sair deste grupo, envie um e-mail para:
python-brasi...@googlegroups.com

---
Você recebeu essa mensagem porque está inscrito no grupo quot;Python Brasil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para python-brasi...@googlegroups.com.
Para mais opções, acesse https://groups.google.com/d/optout.



--
John Evan Dizaro - Desenvolvimento de Sistema Computacionais
Linux, MSWindows
Celular (41) 9243-3240

Douglas Camata

unread,
Aug 20, 2014, 7:59:40 AM8/20/14
to python...@googlegroups.com
Executar um comando em outro usuário é algo um bocado mais complexo, encontrei uma solução aqui (http://stackoverflow.com/questions/1770209/run-child-processes-as-different-user-from-a-long-running-process/6037494#6037494), mas pessoalmente eu evitaria o máximo possível fazer isso. Caso precisasse fazer mesmo, faria como já comentei: prepararia um script shell separado pra fazer o que eu quero, salvaria ele no sistema de arquivos e executaria ele de dentro do Python.

Marcio Luis Siqueira

unread,
Aug 20, 2014, 8:53:37 AM8/20/14
to python...@googlegroups.com
Bom dia Cleiton, obrigado pela sugestão! Na verdade, estou engatinhando no assunto. Estou estudando por conta, e ainda não sei nada sobre essa biblioteca. Mas já vou começar a pesquisar! O meu propósito com o wget é apenas ter com que 'testar' o subprocess, e com isso aprender a se comunicar com programas através do python. Já consegui fazer o wget ser executado com Phyton, agora quero descobrir como interagir com um terminal já aberto. Estudar por conta própria não é fácil, mas é muito gratificante!


Em 19 de agosto de 2014 23:29, Cleiton Bueno <cleiton...@gmail.com> escreveu:
Não sei da complexidade de sua aplicação, mas se for apenas para chamar o wget porque não implementa com urllib e/ou urllib2? Creio que ganhara em diversos pontos.

--
--
------------------------------------
Grupo Python-Brasil
http://www.python.org.br/wiki/AntesDePerguntar
 
<*> Para visitar o site do grupo na web, acesse:
http://groups.google.com/group/python-brasil
 
<*> Para sair deste grupo, envie um e-mail para:
python-brasi...@googlegroups.com

---
Você recebeu essa mensagem porque está inscrito em um tópico no grupo "Python Brasil" dos Grupos do Google.
Para cancelar inscrição nesse tópico, acesse https://groups.google.com/d/topic/python-brasil/d038JKfxT5k/unsubscribe.
Para cancelar inscrição nesse grupo e todos os seus tópicos, envie um e-mail para python-brasi...@googlegroups.com.

Para mais opções, acesse https://groups.google.com/d/optout.



--
- Marcio Luís - 

Douglas Camata

unread,
Aug 20, 2014, 10:04:09 AM8/20/14
to python...@googlegroups.com
@Marcio: um shell é aberto para cada comando que você quiser executar. Por isso eu recomendo usar o esquema do script bash com todos os comandos que você precisa. 


Você recebeu essa mensagem porque está inscrito no grupo quot;Python Brasil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para python-brasi...@googlegroups.com.

Para mais opções, acesse https://groups.google.com/d/optout.



--

Marcio Luis Siqueira

unread,
Aug 20, 2014, 10:14:41 AM8/20/14
to python...@googlegroups.com
Entendi, então é um processo para um shell. Bom... lá vamos nós estudar shell script também! 

Ademir Francisco da Silva

unread,
Aug 20, 2014, 10:37:13 AM8/20/14
to python...@googlegroups.com
E não se chama ..., o nome é shebang ...

http://pt.wikipedia.org/wiki/Shebang
> --
> --
> ------------------------------------
> Grupo Python-Brasil
> http://www.python.org.br/wiki/AntesDePerguntar
>
> <*> Para visitar o site do grupo na web, acesse:
> http://groups.google.com/group/python-brasil
>
> <*> Para sair deste grupo, envie um e-mail para:
> python-brasi...@googlegroups.com
>
> ---
> Você recebeu essa mensagem porque está inscrito no grupo quot;Python
> Brasil" dos Grupos do Google.
> Para cancelar inscrição nesse grupo e parar de receber e-mails dele,
> envie um e-mail para python-brasi...@googlegroups.com
> <mailto:python-brasi...@googlegroups.com>.
> Para mais opções, acesse https://groups.google.com/d/optout.


--
Ademir Francisco da Silva
Skype ...: Ademir_Francisco_da_Silva
[ CMC ] God will do me justice

Douglas Camata

unread,
Aug 20, 2014, 11:56:21 AM8/20/14
to python...@googlegroups.com
Ou "pound bang", que é apelidado somente de "bang" aqui na empresa. :P


2014-08-20 11:37 GMT-03:00 Ademir Francisco da Silva <ademir...@gmail.com>:
E não se chama ..., o nome é shebang ...

http://pt.wikipedia.org/wiki/Shebang


On 19/08/2014 20:51, Marcio Luis Siqueira wrote:
  Não sabia que se chamava 'bang', mas sim... está dessa forma:

#!/usr/bin/python3
# -*- coding: utf-8 -*-

Tmabém tentei como sugeriu:

processo = subprocess.Popen(['phantehon-terminal | wget www.google.com.br']...
 Mas também não funcionou.

--
--
------------------------------------
Grupo Python-Brasil
http://www.python.org.br/wiki/AntesDePerguntar

<*> Para visitar o site do grupo na web, acesse:
http://groups.google.com/group/python-brasil

<*> Para sair deste grupo, envie um e-mail para:


---
Você recebeu essa mensagem porque está inscrito no grupo quot;Python Brasil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para python-brasil+unsubscribe@googlegroups.com <mailto:python-brasil+unsub...@googlegroups.com>.

Para mais opções, acesse https://groups.google.com/d/optout.


--
Ademir Francisco da Silva
Skype  ...: Ademir_Francisco_da_Silva
[ CMC ] God will do me justice
--
--
------------------------------------
Grupo Python-Brasil
http://www.python.org.br/wiki/AntesDePerguntar

<*> Para visitar o site do grupo na web, acesse:
   http://groups.google.com/group/python-brasil

<*> Para sair deste grupo, envie um e-mail para:
--- Você está recebendo esta mensagem porque se inscreveu no grupo "Python Brasil" dos Grupos do Google.

Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para python-brasil+unsubscribe@googlegroups.com.
Para obter mais opções, acesse https://groups.google.com/d/optout.



--

Filipe Cifali

unread,
Aug 20, 2014, 12:08:14 PM8/20/14
to python...@googlegroups.com
Procure a diferença entre bash, sh, zsh e outras variantes, é bem interessante saber o que está usando por debaixo dos panos pois existem sintaxes diferentes que podem causar falhas ao executar em ambientes diferentes.

Escolha o shell correto para executar os códigos e esteja atento ao retorno dos binários ($? é teu amigo) 

Happy hacking ;) 
[ ]'s

Filipe Cifali Stangler

Marcio Luis Siqueira

unread,
Aug 20, 2014, 1:33:09 PM8/20/14
to python...@googlegroups.com
Obrigado por mostrar o caminho! Quando se estuda por conta a gente fica realmente perdido as vezes...
Reply all
Reply to author
Forward
0 new messages