subprocess – Executando programas externos

Quando estava aprendendo a programar em linguagem C, no início da graduação, descobri a famigerada função system() que servia para executar um programa/comando em um shell a partir de um programa em linguagem C. A possibilidade de executar programas externos logo me chamou a atenção, mas a fissura durou pouco tempo. Logo descobri suas limitações. Percebi que quando fazia:

x = system("ls -l");

A única coisa que retornava para a variável x era o status de execução do comando passado como argumento. Ou seja, meu programa pouco poderia interagir diretamente com a saída que o “ls -l” (ou qualquer comando passado) gerava, exceto saber se a execução ocorreu com sucesso ou não. Se eu quisesse usar algum valor que o comando jogasse na tela, simplesmente não poderia. Claro que sempre dava pra fazer gambiarra, como redirecionar a saída do comando para um arquivo (via redirecionamento do shell) e depois ler tal arquivo. Como:

x = system("ls -l > saida.txt");
if (fp = fopen("saida.txt", "r")) {
. . .

😛

Depois descobri que existiam outras formas de fazer isso. Mas isso não vem ao caso agora. O que quero mostrar nesse post é que existe um módulo Python que permite que criemos processos, executando programas externos ao nosso código e permitindo que analisemos a saída que tal programa geraria na tela se executado em um shell comum. Esse módulo se chama subprocess.
O subprocess oferece três funções principais para execução de programas:
  • call()
  • check_call()
  • check_output()
Considere que precisamos, em nosso programa, obter informações sobre as partições do disco rídigo. Poderíamos invocar a execução do programa df (man df), que mostra informações sobre o espaço em disco das partições e verificar a saída deste.
Podemos, inicialmente, usar a função call():
>>> import subprocess
>>> r = subprocess.call(["df", "-h"])
Filesystem Size Used Avail Use% Mounted on
/dev/sda7 189G 5.4G 174G 3% /
udev 1.9G 4.0K 1.9G 1% /dev
tmpfs 764M 1.1M 763M 1% /run
none 5.0M 0 5.0M 0% /run/lock
none 1.9G 500K 1.9G 1% /run/shm
/dev/sda6 221G 6.2G 203G 3% /home
>>> print r
0
>>>
Observe que a função call() recebeu como entrada uma lista, contendo o nome do programa a ser executado (df), seguido pelos argumentos para esse programa (-h (–human-readable)). Veja que a chamada à função fez com que a saída do programa df fosse impressa na saída padrão. O valor que a função call() retorna nada mais é do que o status de execução do programa executado (no caso, 0, ou, sucesso).
Certo, mas e se precisarmos usar os valores lidos para realizar alguma operação? A função call() não seria suficiente, pois não está permitindo que acessemos o resultado mostrado na tela.
Para resolver isso, podemos usar a função check_output():
>>> r = subprocess.check_output(["df", "-h"])
>>> print r
Filesystem Size Used Avail Use% Mounted on
/dev/sda7 189G 5.4G 174G 3% /
udev 1.9G 4.0K 1.9G 1% /dev
tmpfs 764M 1.1M 763M 1% /run
none 5.0M 0 5.0M 0% /run/lock
none 1.9G 500K 1.9G 1% /run/shm
/dev/sda6 221G 6.2G 203G 3% /home

Veja que agora temos a saída do programa sendo retornada pela função check_output(), o que permite que manipulemos a saída como quisermos:

import subprocess
r = subprocess.check_output(["df", "-h"])
for linha in r.split('\n'):
    if 'sda6' in linha:
        print linha.split(' ')[-1]

O código acima, por exemplo mostra somente o ponto de montagem da partição sda6. Assim como realizamos essa operação, poderíamos pegar valores de espaço em disco, ou outras coisas que fossem necessárias, tratando a saída do programa df, chamado através do módulo subprocess.

Mais informações em: http://docs.python.org/library/subprocess.html

Um comentário sobre “subprocess – Executando programas externos

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s