システム管理者として、私はサブプロセスを介してコマンドを呼び出すスクリプトを何度も書いています。コマンドを実際に実行したくない場合があり、何が実行されるかを確認したいだけです。したがって、私のコードは次のような行でいっぱいでした:
alaroffcmd = 'someBinary -h %s' %someHostName
...
if options.tstmd:
print alaroffcmd
else:
chctxt = sp.Popen(alamoffcmd,shell=True, stdout=sp.PIPE)
...
私は「テストモード」が非常に役立つだろうと思っていました。
使用例として:
lsp=nPopen('ls -l',shell=True, stdout=sp.PIPE, testmode=True)
発行するコマンドを出力するだけです。これは冗長に思えるかもしれませんが、実際には、スクリプトで決定された条件に基づいて決定される非常に複雑なコマンドを使用してサブプロセスを呼び出すことがあります(上記の例はsomeHostName
)
これを、 initメソッドをオーバーライドして関数を拡張する方法の例として使用しました。subprocess.Popen
これが私のニーズに合うように拡張した方法です:
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
これは期待どおりに機能しますが、__init__
メソッドをオーバーライドしてクラスを拡張したことがないので、これが正しいかどうか疑問に思っていました。つまり、これを行うためのよりPython的な方法はありますか?super
Python3との互換性を高めるために使用する必要がありますか?