好的,这是非常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()
答案 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
是一个关键字,你的参数周围不需要函数括号。)