Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何有条件地拦截通过os.path、shutil和子流程模块完成的I/O?_Python_Python 2.7_Module_Proxy - Fatal编程技术网

Python 如何有条件地拦截通过os.path、shutil和子流程模块完成的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。所有包装函数都会检查一

我正在从事一个Python2.7项目,做大量的I/O工作;进程通过
子进程
模块启动,目录通过
操作系统创建。makedirs
,文件通过
shutil.copy2
等进行复制

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

到目前为止,我考虑了两种方法:

  • 为所有我想静默的东西编写包装函数,例如,
    mymakedirs
    ,它只是转发到
    os.makedirs
    。所有包装函数都会检查一个全局标志,如果请求,则不执行任何操作。不幸的是,这意味着不仅要编写大量的包装函数,还要涉及大量的现有代码

  • > p>编写代理模块,如“代码> MySuutl < /Cord>”,它考虑全局标志,并根据SUUTIL导入*<代码>执行<代码>,或提供存根。我能看到的唯一缺点是——我如何轻松地知道要编写哪些存根(我能看到模块中调用了哪些函数吗?),并且我需要对所有客户端代码做一些轻微的修改,例如,
    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
    可能是您的朋友。