En tant qu'administrateur système, je me retrouve souvent à écrire des scripts qui appellent des commandes via un sous-processus. Parfois, je ne veux pas que les commandes soient réellement exécutées, et je veux juste voir ce qui serait exécuté. Par conséquent, mes codes étaient remplis de lignes comme celle-ci :
alaroffcmd = 'someBinary -h %s' %someHostName
...
if options.tstmd:
print alaroffcmd
else:
chctxt = sp.Popen(alamoffcmd,shell=True, stdout=sp.PIPE)
...
Je pensais qu'un "mode test" serait très utile.
A titre d'exemple d'utilisation :
lsp=nPopen('ls -l',shell=True, stdout=sp.PIPE, testmode=True)
Imprime simplement la commande à émettre. Cela semble peut-être redondant, mais dans la vie réelle, j'appelle parfois des sous-processus avec des commandes très complexes, qui sont décidées en fonction de conditions déterminées dans le script (ci-dessus il y a un exemple avec someHostName
)
Je l'ai utilisé comme un exemple de la manière d'étendre une fonction en surchargeant sa fonction init méthode, . Voici comment j'ai étendu subprocess.Popen
pour répondre à mes besoins :
import subprocess as sp
class nPopen(sp.Popen):
def __init__(self, args, bufsize=0, executable=None,
stdin=None, stdout=None, stderr=None,
preexec_fn=None, close_fds=False, shell=False,
cwd=None, env=None, universal_newlines=False,
startupinfo=None, creationflags=0,testmode=False):
if testmode:
print args
return None
p = sp.Popen.__init__(self,args, bufsize, executable,
stdin, stdout, stderr,
preexec_fn, close_fds, shell,
cwd, env, universal_newlines,
startupinfo, creationflags)
return p
Cela fonctionne comme je l'attends, mais comme je n'ai jamais étendu une classe en surchargeant son __init__
Je m'interrogeais sur l'exactitude de cette méthode, ou en d'autres termes : Existe-t-il une manière plus pythique de faire cela ? Devrais-je utiliser super
pour une meilleure compatibilité avec Python3 ?