作为系统管理员,我发现自己多次编写通过子进程调用命令的脚本。有时,我不希望命令实际执行,我只想看看会执行什么。因此,我的代码是这样的:
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__
方法来扩展一个类,所以我想知道这个的正确性,或者换句话说:有没有更 Pythonic 的方法来做到这一点?我应该使用super
更好的 Python3 兼容性吗?