【问题标题】:How can I conditionally intercept I/O done via os.path, shutil and subprocess modules?如何有条件地拦截通过 os.path、shutil 和 subprocess 模块完成的 I/O?
【发布时间】:2013-07-27 08:45:55
【问题描述】:

我正在做一个 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

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

【问题讨论】:

  • 是从subprocess 启动的运行系统shell 或非python 可执行文件的任何东西。如果是这样,尽管/dev/null 可能是您的朋友,但您可能会遇到更大的问题。

标签: python python-2.7 module proxy


【解决方案1】:

在方案一中,你不需要重写你的代码:你可以monkeypatch os来拦截调用:

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

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

【讨论】:

    猜你喜欢
    • 2014-09-28
    • 1970-01-01
    • 1970-01-01
    • 2014-09-11
    • 2011-12-16
    • 1970-01-01
    • 2011-02-17
    • 1970-01-01
    • 2020-04-11
    相关资源
    最近更新 更多