Assine a Lista Dicas-L
Receba diariamente por email as dicas
de informática publicadas neste site
Para se descadastrar, clique aqui.
Manipulando comandos Linux com Python!
Colaboração: Rafael Henrique da Silva Correia
Data de Publicação: 03 de Outubro de 2007
Hoje quando escrevi esta dica a dica do dia era a dica do Bruno Magalhães
de Souza, ele ensinava a usar comandos do sistema operacional em php,
pois agora venho a vocês para ensinar a mesma coisa, mas com cgi mas
especificamente Python! A um tempo atrás rachei minha cabeça para tentar
descobrir uma forma de pegar a saída de uma comando do Linux em Python,
hoje consigo tanto executá-lo como conseguir sua saída ;) !
É o seguinte:
Abrindo o interpretador Python:
asm:/home/rafael# python
Python 2.4.4 (#2, Apr 5 2007, 20:11:18)
[GCC 4.1.2 20061115 (prerelease) (Debian 4.1.1-21)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>>import os
>>>import commands
Agora explicarei esses dois módulos importados...
- O módulo os tem logicamente relação com seu sistema operacional
- E o módulo commands logicamente tem relação com os comandos deste sistema
(seja qualquer um que rode Python)
Aí vem...
>>>os.system("ls")
Este método system chamará o comando ls e o executará! Agora vem o detalhe
ao qual demorei um tempo pra descobrir...
>>>var = os.system("ls")
Esta variável var pegará o return do comando executado (0 se deu certo o
comando e diferente de 0 se deu errado)! Testem...
>>>print var
Aí pensei cá com meus neurônios, e como pego o output?? Aí que tive a idéia de pedir um help para o meu professor e veio a saída (literalmente hehehe)...
>>>var = commands.getoutput("ifconfig")
Aí agora sim! Agora eu pego a variável como uma string verifiquem:
>>>type(var)
<type 'str'>
>>>print var
Bingoo! Bom aí eu faço o que eu quiser com a saída, transformo em lista,
gravo num arquivinho texto, etc! Então podem brincar a vontade :)! Dá
pra pegar as saídas dos comandos pela web também via apache! Então tem n
brincadeiras só falta brincar agora! Boa sorte em seus testes!
Uma boa saída no python é consultar o dir()...
>>>dir(commands)
['__all__', '__builtins__', '__doc__', '__file__', '__name__', 'getoutput', 'getstatus', 'getstatusoutput', 'mk2arg', 'mkarg']
Ele te mostrará tudo que é possível fazer com aquilo (todos os métodos), outra opção é o help()...
>>>help(commands)
Que é tipo de um man do Python :)... flw!
Veja a relação completa dos artigos de Rafael Henrique da Silva Correia
Referências Adicionais
Referências adicionais sobre os assuntos abordados neste site podem ser encontradas em nossa Bibliografia.
Avalie esta dica
- Currently 3.16/5
- 1
- 2
- 3
- 4
- 5
Avaliação:
3.2 /5
(533 votos)
Opinião dos Leitores
Alvaro de Jesus
17 Ago 2008, 01:13
Valeu mesmo Rafael!
Curto e grosso!
Excelente.
Mais 5 estrelas.
Adam Victor Nazareth Brandizzi
07 Out 2007, 19:42
Complementando a informação do "Jaú", o módulo subprocess vai tornar o módulo commands e as funções popen* obsoletas. Utilize o módulo subprocess sempre que possível.
Marcelo A.
05 Out 2007, 18:28
Muito bom Rafael !
5 estrelas pro artigo !
Jaú
03 Out 2007, 09:07
Boa dica, Rafael!!! Outro dia eu também estava procurando pela mesma coisa (executar comandos e pegar a saída) e fuçando na documentação, acabei chegando ao módulo subprocess. Esse é um escriptezinho que fiz outro dia para adicionar arquivos ao SVN:
#!/bin/env python
# coding=iso-8859-1
# Propósito: poe arquivos nao versionados sob o controle de versao
# Autor: Jaú
# Data: 26/09/2007
from subprocess import Popen, PIPE
import re
import os
def main():
process = Popen(["svn", "status"], stdout=PIPE)
result = process.stdout.read()
for line in result.splitlines():
m = re.match(r"\?\s+(.+)", line)
if m:
file = m.group(1)
os.system("svn add %s" % file)
if __name__ == "__main__":
main()
Referência para o módulo subprocess: http://docs.python.org/lib/module-subprocess.html