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")) {
. . .
😛
- call()
- check_call()
- check_output()
>>> 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 >>>
>>> 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 um comentário
Você precisa fazer o login para publicar um comentário.
Muito obrigado pela dica. Estou migrando alguns códigos pra python e me deparei com essa situação…