gpt4 book ai didi

python - 通过继承扩展 subprocess.Popen

转载 作者:行者123 更新时间:2023-11-28 22:58:57 25 4
gpt4 key购买 nike

作为系统管理员,我发现自己多次编写通过子进程调用命令的脚本。有时,我不希望命令实际执行,我只想看看会执行什么。因此,我的代码全是这样的:

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 的例子)

我将其用作 an example how to extend a function by overriding it's init method, .以下是我如何扩展 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 兼容性吗?

最佳答案

我根本不会使用子类,因为听起来您不想更改 Popen 对象的功能。听起来您只想更改其构造函数的功能。

我会创建一个虚拟的 Popen 类,它只打印出它的参数。 (这是使用 Python 3.x 风格编写的,但很容易转换为 Python 2.x。)

class DummyPopen(object):
def __init__(self, *args, **kw):
print('Popen({})'.format(
', '.join([repr(arg) for arg in args] +
['{}={!r}'.format(*pair) for pair in kw.items()])))
self.returncode = 1

def wait(self):
return 1

# et cetera

然后您可以根据需要触发对虚拟类的使用。

def Popen(*args, testmode=False, **kw):
if testmode:
return DummyPopen(*args, **kw)
return subprocess.Popen(*args, **kw)

甚至:

if testmode:
Popen = DummyPopen
else:
Popen = subprocess.Popen

这利用了 Python 的“鸭子类型”约定——任何与 Popen 对象具有相同接口(interface)的对象在功能上与 Popen 对象没有区别,只要你不滥用 isinstance() 太多。

请注意,这两种方法都允许您从模块中导入 Popen

from mymodule import Popen

关于python - 通过继承扩展 subprocess.Popen,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13383322/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com