获取上课的完整模块路径

时间:2018-09-03 13:09:10

标签: python

我正在使用包装器将Qt窗口停靠在程序中。问题是包装器将任何窗口类都作为str,然后对其进行初始化,如果您将内容分割成多个文件,则包装器将变得不是pythonic(请参阅原始编辑以了解其工作原理,并不重要)问题)

例如:

import module.submodule.MainWindow:路径为"module.submodule.MainWindow"

import module.submodule.MainWindow as MW:路径为"MW"

from module import submodule:路径为"submodule.MainWindow"

我当前的解决方法是module.MainWindow.shpw(namespace="module.MainWindow"),但我不希望被要求提供它作为参数

我尝试制作一个函数来解析globals()来找到路径,并且它在顶层确实可以很好地工作。但是,我发现globals()对于每个导入都是唯一的,因此从我的模板类中调用时它什么也没做。

from types import ModuleType
import inspect
import site

site_packages_loc = site.getsitepackages()

default_modules = set([sys.modules[i] for i in set(sys.modules.keys()) & set(sys.builtin_module_names)])

def get_class_namespace(search, globals_dict=None, path=[]):
    if globals_dict is None:
        globals_dict = globals()

    #Find all objects that are modules
    modules = {}
    for k, v in globals_dict.iteritems():
        if v == search:
            return '.'.join(path + [v.__name__])
        if isinstance(v, ModuleType) and v not in default_modules:
            modules[k] = v

    #Check recursively in each module
    for k, v in modules.items():

        #Check it's not a built in module
        module_path = inspect.getsourcefile(v)
        if any(module_path.startswith(i) for i in site_packages_loc):
            continue

        module_globals = {func: getattr(v, func) for func in dir(v)}
        return_val = get_class_namespace(search, module_globals, path=path+[k])
        if return_val is not None:
            return return_val

是否有更好的方法可以解决此问题,或者我可以以某种方式从导入中请求最高级的globals()

0 个答案:

没有答案