我有一个目录,我们称之为存储装满了包含笨拙名字的包,比如mypackage-xxyyzzww,当然存储在我的PYTHONPATH上.由于包具有很长的不可知名称,因此所有包都符号链接到更友好的名称,例如mypackage.
现在,我不想依赖文件系统符号链接来执行此操作,而是尝试使用sys.path和sys.modules.目前我正在做这样的事情:
import imp imp.load_package('mypackage','Storage/mypackage-xxyyzzww')
以这种方式做事有多糟糕,未来有可能会破裂吗?有趣的是,文档中甚至没有提到imp.load_package函数.
编辑:除了不依赖于符号链接,我不能再使用PYTHONPATH变量了.
解决方法
importlib可能更合适,因为它使用/实现了
PEP302机制.
按照DictImporter示例,但覆盖find_module以查找真实文件名并将其存储在dict中,然后重写load_module以从找到的文件中获取代码.
创建存储模块后,您不需要使用sys.path
#from importlib import abc import imp import os import sys import logging logging.basicConfig(level=logging.DEBUG) dprint = logging.debug class MyImporter(object): def __init__(self,path): self.path=path self.names = {} def find_module(self,fullname,path=None): dprint("find_module({fullname},{path})".format(**locals())) ml = imp.find_module(fullname,path) dprint(repr(ml)) raise ImportError def load_module(self,fullname): dprint("load_module({fullname})".format(**locals())) return imp.load_module(fullname) raise ImportError def load_storage( path,modname=None ): if modname is None: modname = os.path.basename(path) mod = imp.new_module(modname) sys.modules[modname] = mod assert mod.__name__== modname mod.__path__=[path] #sys.Meta_path.append(MyImporter(path)) mod.__loader__= MyImporter(path) return mod if __name__=="__main__": load_storage("arbitrary-path-to-code/Storage") from Storage import plain from Storage import mypkg
然后当你导入Storage.mypackage时,python会立即使用你的导入器而不必费心去查看sys.path
这不起作用.上面的代码可以在Storage下导入普通模块,而不需要存储在sys.path上,但3.1和2.6似乎都忽略了PEP302中提到的loader属性.如果我取消注释sys.Meta_path行,3.1使用StackOverflow消失,2.6使用ImportError消失.嗯…我现在没时间了,但可能会稍后再看.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。