0

我正在做一个 Python 2.7 项目,做大量的 I/O;通过subprocess模块启动进程,通过创建目录,通过os.makedirs复制文件shutil.copy2等等。

现在我想要一个“试运行”模式,即程序实际上不执行任何 I/O。有没有一种简单的方法可以做到这一点,知道基本上我所有的 I/O 都是使用三个模块 os、shutil 和 subprocess 完成的?

到目前为止我考虑过的两种方法:

  1. 为我想要静音的所有内容编写包装函数,例如mymakedirs只转发到os.makedirs. 所有包装函数都会检查一个全局标志,如果有请求则什么都不做。不幸的是,这意味着不仅要编写大量的包装函数,还要触及大量现有的代码。

  2. 编写类似myshutil考虑全局标志的代理模块,并根据from shutil import *它提供或提供存根。我能看到的唯一缺点 - 我怎样才能轻松地知道要编写哪些存根(我可以看到模块中调用了哪些函数吗?),并且我需要对所有客户端代码进行轻微修改,以便import shutil例如更改为import myshutil.

到目前为止,第二个想法对我来说似乎是最好的,但我想知道:是否有另一种更好的技术来代理现有模块,尽可能少地修改现有代码?

4

1 回答 1

1

在解决方案 1 中,您不需要重写代码:您可以通过monkeypatch os 来拦截调用:

>>> def mymkdir(*args):
...         print "mkdir", args
... 
>>> os.mkdir = mymkdir # monkey patching os
>>> os.mkdir("toto")
mkdir ('toto',)

您甚至可以切换整个模块,例如os = myos. 抱歉,我现在没有时间找出具体的解决方案。

于 2013-07-26T22:57:26.720 回答