Python 如何有条件地拦截通过os.path、shutil和子流程模块完成的I/O?
我正在从事一个Python2.7项目,做大量的I/O工作;进程通过Python 如何有条件地拦截通过os.path、shutil和子流程模块完成的I/O?,python,python-2.7,module,proxy,Python,Python 2.7,Module,Proxy,我正在从事一个Python2.7项目,做大量的I/O工作;进程通过子进程模块启动,目录通过操作系统创建。makedirs,文件通过shutil.copy2等进行复制 现在我想要一种“干运行”模式,即程序实际上不做任何I/O。知道基本上我所有的I/O都是使用三个模块os、shutil和subprocess完成的,有没有一种简单的方法可以做到这一点 到目前为止,我考虑了两种方法: 为所有我想静默的东西编写包装函数,例如,mymakedirs,它只是转发到os.makedirs。所有包装函数都会检查一
子进程
模块启动,目录通过操作系统创建。makedirs
,文件通过shutil.copy2
等进行复制
现在我想要一种“干运行”模式,即程序实际上不做任何I/O。知道基本上我所有的I/O都是使用三个模块os、shutil和subprocess完成的,有没有一种简单的方法可以做到这一点
到目前为止,我考虑了两种方法:
mymakedirs
,它只是转发到os.makedirs
。所有包装函数都会检查一个全局标志,如果请求,则不执行任何操作。不幸的是,这意味着不仅要编写大量的包装函数,还要涉及大量的现有代码import-shutil
更改为import-myshutil
到目前为止,第二个想法对我来说似乎是最好的,但我想知道:有没有另一种更好的技术来代理现有模块,并且尽可能少地修改现有代码?在解决方案1中,您不需要重写代码:您可以使用monkeypatch os来拦截调用:
>>> def mymkdir(*args):
... print "mkdir", args
...
>>> os.mkdir = mymkdir # monkey patching os
>>> os.mkdir("toto")
mkdir ('toto',)
您甚至可以切换整个模块,例如
os=myos
。抱歉,我现在没有时间找出具体的解决方案。是从运行系统shell或非python可执行文件的子进程启动的任何东西。如果是这样,您可能会遇到更大的问题,尽管/dev/null
可能是您的朋友。