Brincando com processos


Bom, quanto tentei utilizar o modulo popen2, me foi informado que este encontrava-se depreciado e trocado pelo modulo subprocess. Então resolvi dar uma olhada neste modulo para me atualizar… hehehe
Então é assim, para executar-mos um comando no nosso sistema operacional, como um processo controlável, utilizamos a classe Popen

>>> from subprocess import Popen,PIPE
>>> p = Popen(['cmd','/C dir c:\\'],stdout=PIPE)
>>> p.communicate()[0]

Bom, o que fizemos aqui ?
1. Importamos o que é necessário para abrir um subprocesso
2. Criamos nosso subprocesso, o primeiro parametro é uma lista com nosso comando e seus parametros
3. Executamos nosso subprocesso (.communicate()) e já pegamos a saida do mesmo, já que esta foi direcionada para a saida padrão (stdout=PIPE).

Assim, veremos nossa saida diretamente no terminal.
Vejam isto agora:

>>> f = file('c:\\temp\\saida.log','w')
>>> p = Popen(['cmd','/C dir c:\\'],stdout=f)
>>> p.communicate()
(None, None)
>>> f.close()

E agora ? Bom, abrimos um arquivo para escrita, criamos o processo direcionando a saida do comando para o arquivo, executamos o comando e fechamos o arquivo. Agora abra o arquivo e veja o que tem nele.. blz !

O método “communicate” retorna uma tupla com stdout e stdin, por isto que pegamos a posição 0 (ZERO) quando o executamos.

Agora, um detalhe interessante, quando executamos um comando via system, por exemplo um “dir c:\” no windows, ou um “ls -l /” no linux, este comando simplesmente funciona, mostrando sua saida na saida do terminal, e retornando o codigo de retorno do comando. Agora, quando executamos os mesmo comandos via Popen, “p = Popen(‘dir c:\\’,stdout=PIPE)”, ocorre um erro, dizendo que não pode encontrar o arquivo especificado, mas o porque disto ? Olhando a definição de cada um, vemos que o “os.system” abre um subshell para executar o comando, e o Popen abre um novo processo deixando que você conecte-se às suas entradas e saidas. Bom, não deixei isto muito exclarecido pois realmente não sei as diferenças em baixo nível, mas já dá para se ter uma ideia do que se pode fazer com um e outro.

E podemos fazer varias outras coisas com este controle todo que o subprecess nos dá. Por exemplo, como temos exemplificado na documentação do modulo, podemos conectar a saida de um comando à entrada de outro, assim:

>>> p1 = Popen(["dmesg"], stdout=PIPE)
>>> p2 = Popen(["grep", "hda"], stdin=p1.stdout, stdout=PIPE)
>>> output = p2.communicate()[0]

Ai, estamos executando como se fosse no terminal: “dmesg | grep hda”

Bom, agora jah sabemos o básico para executar comandos do sistema operacional, com subprocessos, então leiam mais na documentação e criem suas proprias soluções, e não deixem de comentar caso saibam algo diferente e/ou interessante sobre isto.

Anúncios

Deixe um comentário

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 )

Foto do Google+

Você está comentando utilizando sua conta Google+. 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 )

w

Conectando a %s