[Python] Os.popen e comando route add

Giampaolo Rodolà g.rodola a gmail.com
Lun 17 Gen 2011 12:47:21 CET


Spesso mi porto dietro questa funzione in molti script per fare lavori
sporchi/veloci:

import subprocess, warnings

def sh(cmdline):
    """run cmd in a subprocess and return its output.
    raises RuntimeError on error.
    """
    p = subprocess.Popen(cmdline, shell=True, stdout=subprocess.PIPE,
                                           stderr=subprocess.PIPE)
    stdout, stderr = p.communicate()
    if p.returncode != 0:
        raise RuntimeError(stderr)
    if stderr:
        warnings.warn(stderr, RuntimeWarning)
    return stdout

 >>> sh("whoami")
 'giampaolo\n'
 >>> sh("blabla")
 Traceback (most recent call last):
   File "<stdin>", line 1, in <module>
   File "_utils.py", line 12, in sh
     raise RuntimeError(stderr)
 RuntimeError: /bin/sh: blabla: command not found
 >>>

A partire da python 2.7 puoi usare subprocess.check_output() che peṛ
trovo meno comoda:
http://docs.python.org/library/subprocess.html#subprocess.check_output


--- Giampaolo
http://code.google.com/p/pyftpdlib/
http://code.google.com/p/psutil/



Il 15 gennaio 2011 12:27, Paolo Bernardi <villa.lobos a tiscali.it> ha scritto:
> Tra le altre cose, se vuoi restare aggiornato, ti consiglio di dare
> un'occhiata al modulo subprocess, particolarmente alla sezione su come
> rimpiazzare le chiamate os.popen*:
>
> http://docs.python.org/library/subprocess.html#replacing-os-popen-os-popen2-os-popen3
>
> Con la popen, ad esempio, mi è capitato di fare qualcosa di simile:
>
> p = subprocess.Popen(['axel', '-o', file, self.url], shell=False,
> stdout=subprocess.PIPE)
> line = p.stdout.readline()
> while line != None and line != '' and not p.poll():
>    [...]
>    line = p.stdout.readline()
>
> In questo caso ovviamente mi serviva l'output riga per riga (man mano
> che axel avanzava), ma puoi anche leggere tutto in blocco.
>
> Paolo
>
> On Fri, 2011-01-14 at 12:03 +0100, Stefano Dal Pra wrote:
>> Ciao,
>> prova con os.popen3 :
>> stdin,stdou,stderr = os.popen("ping 151.1.1.1")
>>
>> dovresti scoprire che il SIOCADDRT compare con stderr.readline() ...
>>
>> Stefano
>
> _______________________________________________
> Python mailing list
> Python a lists.python.it
> http://lists.python.it/mailman/listinfo/python
>
>


Maggiori informazioni sulla lista Python