如何从URL获取模块并将其导入,以便忽略其有问题的依赖项?

时间:2016-05-13 10:14:16

标签: python url import urllib

好的,这是非常hacky和愚蠢的编程。我有一个可以从URL导入模块文件的函数。它工作正常,几乎不安全。我想导入一个具有问题依赖性的模块文件(我所能使用的系统不能支持该特定的依赖关系),但我想从该模块获得的功能并不依赖于有问题的依赖关系,所以如果可以忽略它就没问题了。

我的想法是我可以使用这个smuggle函数(如下所示)获取模块文件,然后使用FuckIt.py以某种方式导入它,但我不知道如何制作这些两个想法一起工作。

怎么可以这样做?

import imp
import urllib

def smuggle(
    module_name = None,
    URL         = None
    ):
    if module_name is None:
        module_name = URL
    try:
        module = __import__(module_name)
        return(module)
    except:
        try:
            module_string = urllib.urlopen(URL).read()
            module = imp.new_module("module")
            exec module_string in module.__dict__
            return(module)
        except: 
            raise(
                Exception(
                    "module {module_name} import error".format(
                        module_name = module_name
                    )
                )
            )
            sys.exit()

damned_silly_module = smuggle(
    module_name = "damned_silly_module",
    URL = "https://raw.githubusercontent.com/https://github.com/justsomefuckingguy/damned_silly_module/master/damned_silly_module.py"
)

damned_silly_module.some_function_or_other()

1 个答案:

答案 0 :(得分:1)

抛开Fuckit.py,如果这是关于具有特定失败依赖关系的特定模块,那么使其工作的最佳方法是通过使依赖项的导入成功:提供具有相同的模拟子模块名称,包含任何要求的存根。例如,如果damn_silly_module尝试导入您没有的silly_walks,请创建一个模拟silly_walks模块并安排找到它。

import sys
sys.path.insert(0, "path/to/mock/modules")
module = imp.new_module("module")

或类似的东西。您甚至可以捕获ImportError并仅在相关模块不存在时执行此操作。这类似于导入的python 2自定义,例如cPickle as pickle,如果不可用,则会失败回import pickle

如果您希望这一般工作,将来会看到您将看到的模块,您需要捕获ImportError,检查它以找出遗漏的内容,在运行中模拟它并再试一次

顺便提一下,您的异常处理需要一些工作。永远不要抓住一切except:没有参数); catch ImportError(如果导入成功但稍后的名称查找失败,则可能NameError。永远不要提出无差别的Exception,提高ImportError。在这种情况下,最好使用简单的

重新引发刚刚捕获的异常
raise

摆脱sys.exit()。这是死代码 - 它永远不会被触及。 (另外:raise是一个关键字,你的参数周围不需要函数括号。)